TransWikia.com

Problemas com função sum() dentro de summarise usando plyr e tidyverse!

Stack Overflow em Português Asked by Jean Karlos on December 14, 2021

Olá, boa tarde!

Estou encontrando dificuldades em utilizar tidyverse, para realizar uma função de empilhar + summarise(soma=sum(value)) + desempilhar = base%>%pivot_longer(cols=(),names_to(),values_to())%>%group_by()%>%summarise(soma=sum(value))%>%spread(variable,m). Ao utilizar este código modificando apenas a função dentro de summarise(), de sum() para mean() ou sd(), sempre funcionou, agora para sum(), não funciona, ele não soma, apenas repete o valor.

Pra verificar, utilizei reshape2::dcast(plyr::ddply(reshape2::melt())) que era a função que sempre tive o hábito de utilizar, além de confrontar com a função sum() aplicado aos valores em um subset() determinado.

gostaria do auxílo de vocês para verificar como utilizar por tidyverse, de preferencia sem aquelas saidas de "summarise() … (override with .groups argument)".

Abaixo segue a base, e os códigos:

  base<-data.frame(expand.grid(FAT1=1:4,FAT2=1:2,FAT3=1:2,AVA=1:6,REP=1:3),
VAR1=runif(3*96,0,1),
VAR2=runif(3*96,-1.5,0),
VAR3=runif(3*96,0,2.5))

require(reshape2)
require(plyr)
require(tidyverse)

mbase<-base %>% pivot_longer(cols=all_of(c("VAR1","VAR2","VAR3")),names_to = "variable",values_to = "value")




dcast(ddply(mbase, .(FAT1,FAT2,FAT3,AVA,variable), summarise, soma=sum(value)),FAT1*FAT2*FAT3*AVA~variable,fun.aggregate = sum,value.var ="soma" )
# (FAT1=1,FAT2=1,FAT3=1,AVA=1)$VAR1 = 1.704

sum(subset(base,FAT1==1 & FAT2==1 & FAT3==1 & AVA==1)[,"VAR1"])
# = 1.704



base %>% pivot_longer(cols=all_of(c("VAR1","VAR2","VAR3")),names_to = "variable",values_to = "value")%>%
  group_by(FAT1,FAT2,FAT3,AVA,variable) %>%  summarise(soma = sum(value)) %>% spread(variable,soma)

One Answer

Estes dois exemplos dão em cada linha valores diferentes das somas. O primeiro exemplo é o da pergunta, só com ungroup no fim de modo a obter TRUE quando os resultados são comparados com o segundo método,muito mais simples.

Quanto à segunda pergunta, para não ter as mensagens do summarise segue-se o que está na documentação, help('summarise'),

When .groups is not specified, you either get "drop_last" when all the results are size 1, or "keep" if the size varies. In addition, a message informs you of that choice, unless the option "dplyr.summarise.inform" is set to FALSE.

op <- options(dplyr.summarise.inform = FALSE)

mbase <- base %>% 
  pivot_longer(
    cols = all_of(c("VAR1", "VAR2", "VAR3")),
    names_to = "variable",
    values_to = "value"
  ) %>% 
  group_by(FAT1, FAT2, FAT3, AVA, variable) %>% 
  summarise(soma = sum(value)) %>% 
  spread(variable, soma) %>%
  ungroup()


mbase2 <- base %>% 
  group_by(FAT1, FAT2, FAT3, AVA) %>% 
  summarise_at(vars(starts_with("VAR")), sum) %>%
  ungroup()


identical(mbase, mbase2)
#[1] TRUE

Answered by Rui Barradas on December 14, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP