在聚合中嵌套 SUM 和 MEAN 以获得每组分数的均值

Nesting a SUM and a MEAN in an aggregate to get means of scores per group

我找不到与我的问题相似的数据集,所以我更改了数据集 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 和 post 取平均值 Sepal.Length按类型和物种/

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

如果你想要 table 格式,你可以使用 data.tabledcast 方法:

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