R - 向量的特定部分的平均值

时间:2016-05-05 15:54:36

标签: r

我有以下代码

mean(  myList$scores[ myList$IDs == "1234" ] )

这给出了ID为1234的人的分数的平均值。

假设我有一个ID号列表,这是所有ID号的小样本。

testIDs = c(1234,2345,3456,4567)

如何更改此选项以返回给我4表示平均值为1234,平均值为2345,平均值为3456,平均值为4567。

我知道我可以循环使用testID,但这不是最好的方法。

2 个答案:

答案 0 :(得分:6)

以下方法(存在许多其他方法)如何:

dta <- data.frame(id = rep(letters[1:4], each = 4), x = rnorm(16))

aggregate(dta$x, list(dta$id), mean)
lapply(split(dta$x, dta$id), mean)
tapply(dta$x, dta$id, mean)
by(dta$x, dta$id, mean)

一些时间:

Unit: microseconds
                              expr      mean
aggregate(dta$x, list(dta$id), mean) 892.08428
lapply(split(dta$x, dta$id), mean)   61.05315
tapply(dta$x, dta$id, mean)          172.62361
by(dta$x, dta$id, mean)              421.29666 

这是一个仅反映获取ID子集的编辑:

dta <- data.frame(id = rep(letters[1:10], each = 4), x = rnorm(40))

indx <- dta$id %in% letters[1:4]
lapply(split(dta[indx, 2], dta[indx, 1], drop = TRUE), mean) 

或者,评论中的答案也可以解决问题:

sapply(letters[1:4], function(s) mean(dta$x[ dta$id == s ]))

答案 1 :(得分:0)

我建议以下

by(myList$scores, INDICES = myList$IDs, FUN = mean)[as.character(testIDs)]