2016-09-28 23 views
1

我无法找到与我的问题类似的数据集,所以我将数据集Iris(R中的数据集)更改为看起来相似 - 足够接近!在一个聚合中嵌套一个SUM和一个平均值以获得每组的分数

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中构造此)

其实,只是要清透

我要的是,总结在一起Sepal.Length每个ID代码,然后键入它会在所有这些的ID之和的平均值和后的平均Sepal.Length按类型和物种/

回答

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.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 
+1

我用这个代码在我的实际数据与数字看起来像我预料到的!非常感谢你,这真是太棒了 –

+0

不客气! 'data.table'是一个很好的包 – arvi1000

相关问题