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

Jib*_*ril 0 r

我有以下代码

mean(  myList$scores[ myList$IDs == "1234" ] )
Run Code Online (Sandbox Code Playgroud)

这给了我ID 1234的人的分数的平均值.

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

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

我如何更改这个以返回给我4表示,平均值为1234,平均值为2345,平均值为3456,平均值为4567.

我知道我可以遍历testIDs,但这不是解决这个问题的最好方法.

Raa*_*aad 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)
Run Code Online (Sandbox Code Playgroud)

一些时间:

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 
Run Code Online (Sandbox Code Playgroud)

这是一个编辑,仅反映获取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) 
Run Code Online (Sandbox Code Playgroud)

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

sapply(letters[1:4], function(s) mean(dta$x[ dta$id == s ]))
Run Code Online (Sandbox Code Playgroud)