我有以下代码
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,但这不是解决这个问题的最好方法.
以下方法(存在许多其他方法)如何:
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)