将SUM和MEAN嵌套在一个聚合中,以获得每组得分的方法

时间:2016-09-28 21:11:27

标签: r aggregate summary

我无法找到与我的问题相似的数据集,因此我将数据集Iris(R中的数据集)更改为相似 - 它足够接近!

data = iris
data$type = gl(5,30,150,labels=c("group1","group2","group3","group4","group5"))
data$ID = gl(30,5,150)

然后我使用了以下代码

xtabs(Sepal.Length ~ Species + type, aggregate(Sepal.Length ~ Species + type + ID, data, mean))

导致

type
Species      group1 group2 group3 group4 group5
  setosa      30.16  19.90   0.00   0.00   0.00
  versicolor   0.00  12.20  35.88  11.28   0.00
  virginica    0.00   0.00   0.00  26.24  39.64

我的理解是,我的代码正在做的是为每个ID添加Sepal.Length,然后按每个种类和类型取这些值的平均值。

这是对的吗?

如果没有,我怎么能得到这个?

此外,如果我的数据是每个ID有多种类型,我将如何得到这个? (无法弄清楚如何在R中构建它)

实际上,只是为了非常清楚

我想要的是一个代码,它将每个ID和类型的Sepal.Length加在一起,然后它将取所有ID的平均值,并按类型和种类发布平均值Sepal.Length /

1 个答案:

答案 0 :(得分:1)

使用data.table

library(data.table)
setDT(data)

#sum of Sepal.Length for each ID AND type
data[, id_type_sum := sum(Sepal.Length), by = .(ID, type)]

# mean of this variable by type and species
data[, mean(id_type_sum), by = .(type, Species)]

#   type    Species       V1
# 1: group1     setosa 25.13333
# 2: group2     setosa 24.87500
# 3: group2 versicolor 30.50000
# 4: group3 versicolor 29.90000
# 5: group4 versicolor 28.20000
# 6: group4  virginica 32.80000
# 7: group5  virginica 33.03333

如果您希望以表格形式使用此格式,则可以使用data.table' dcast方法:

library(magrittr) # for the %>% operator
data[, mean(id_type_sum), by = .(type, Species)] %>%
  dcast(Species ~ type)

结果:

      Species   group1 group2 group3 group4   group5
1:     setosa 25.13333 24.875     NA     NA       NA
2: versicolor       NA 30.500   29.9   28.2       NA
3:  virginica       NA     NA     NA   32.8 33.03333