我正在尝试使用等于另一个值的行来计算变量的平均值:
pp$mmean[pp[,1] == '1'] <- mean(pp$mm)[1:nrow(pp[,1] == '1')]
那就是我试图找出mm的平均值 - 使用第一列== 1的行(如果它不等于1则排除所有其他行),其中pp $ mmean结果将仅在下一个指示到这些行。上面的代码给了我:
Error in 1:nrow(pp[, 1] == "1") : argument of length 0
我想对pp [,1]中的每个唯一值多次执行此操作...并为此设置for循环。
不确定我在这里做错了什么......
数据示例,pp:
Plan X mm
1 95 0.323
1 275 0.341818
1 2 0.618
1 75 0.32
1 13 0.399
1 20 0.40
2 219 0.393
2 50 0.060
2 213 0.39
2 204 0.4961
2 19 0.393
2 201 0.388
等等......
答案 0 :(得分:3)
您可以尝试ave
。使用默认参数,ave
为分组变量的每个级别计算mean
,但结果向量与原始数据的长度相同。
pp$mean_mm <- with(pp, ave(mm, Plan))
# Plan X mm mean_mm
# 1 1 95 0.323000 0.400303
# 2 1 275 0.341818 0.400303
# 3 1 2 0.618000 0.400303
# 4 1 75 0.320000 0.400303
# 5 1 13 0.399000 0.400303
# 6 1 20 0.400000 0.400303
# 7 2 219 0.393000 0.353350
# 8 2 50 0.060000 0.353350
# 9 2 213 0.390000 0.353350
# 10 2 204 0.496100 0.353350
# 11 2 19 0.393000 0.353350
# 12 2 201 0.388000 0.353350
评论后 修改; ave
多列。一种可能性是循环使用sapply
计算均值的列。
# sample data
pp <- data.frame(Plan = rep(letters[1:3], each = 3), mm = 1:9, mm1 = 2:10, mm2 = 3:11)
# name of variables for which mean should be calculated
vars <- c("mm", "mm1", "mm2")
# 'loop' over variables using sapply
m <- sapply(vars, function(x){
pp2 <- pp[ , c("Plan", x)]
ave(pp2[ , x], pp2[ , "Plan"])
})
# rename columns of result matrix
colnames(m) <- paste0("mean_", vars)
# add means to original data
cbind(pp, m)
答案 1 :(得分:1)
许多内置选项:
by(pp$mm, pp$X, mean, na.rm=T)
tapply(pp$mm, pp$X, mean, na.rm=T)
使用plyr
:
library(plyr)
ddply( pp, .(X), mean)
使用data.table
:
library(data.table)
pp = data.table(pp)
pp[,mean(mm,na.rm=T),by="X"]
如果您想直接在data.table中设置它:
pp[,AVERAGEbyX:=mean(mm,na.rm=T),by="X"]
更不用说mapply
和aggregate
以下是R内置选项的概述:Using tapply for the subset group of data