按多列聚合并从长到大重新整形

问题描述 投票:0回答:4

在SO上有一些类似于这个主题的问题但不完全像我的用例。我有一个数据集,其中的列布局如下所示

     Id        Description          Value
     10        Cat                  19
     10        Cat                  20
     10        Cat                  5
     10        Cat                  13
     11        Cat                  17
     11        Cat                  23
     11        Cat                  7
     11        Cat                  14  
     10        Dog                  19
     10        Dog                  20
     10        Dog                  5
     10        Dog                  13
     11        Dog                  17
     11        Dog                  23
     11        Dog                  7
     11        Dog                  14    

我想要做的是通过Id,Description来捕获Value列的平均值。最终的数据集看起来像这样。

     Id       Cat         Dog 
     10       14.25       28.5
     11       15.25       15.25

我可以用非常粗暴的方式做到这一点,不是很有效

tempdf1 <- df %>%
  filter(str_detect(Description, "Cat")) %>%
   group_by(Id, Description) %>%
  summarize(Mean_Value = mean(Value) , na.rm = TRUE))

这不是很方便。关于如何更有效地完成预期结果的任何建议都非常感谢。

r dplyr aggregate mean group-summaries
4个回答
1
投票

使用来自dcast包的acast甚至reshape2()

dcast(dat,Id~Description,mean)
   Id   Cat   Dog
 1 10 14.25 14.25
 2 11 15.25 15.25

qazxsw poi可能会更长一些:

Base R

2
投票

我会用 reshape(aggregate(.~Id+Description,dat,mean),direction = "wide",v.names = "Value",idvar = "Id",timevar = "Description") Id Value.Cat Value.Dog 1 10 14.25 14.25 2 11 15.25 15.25 这样做:

tapply

返回一个矩阵对象,所以不要尝试使用“$”访问。


1
投票

您可以使用with( dat, tapply(Value, list(Id,Description), mean)) Cat Dog 10 14.25 14.25 11 15.25 15.25 汇总(计算平均值)每个组,并使用data.table获取所需的表格格式:

dcast()

1
投票

你可以使用library(data.table) foo <- setDT(d)[, mean(Value), .(Id, Description)] # Id Description V1 # 1: 10 Cat 14.25 # 2: 11 Cat 15.25 # 3: 10 Dog 14.25 # 4: 11 Dog 15.25 dcast(foo, Id ~ Description, value.var = "V1") # Id Cat Dog # 1: 10 14.25 14.25 # 2: 11 15.25 15.25 summarise并使用dplyr从长到宽的转换:

tidyr::spread
© www.soinside.com 2019 - 2024. All rights reserved.