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)
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 toFALSE
.
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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP