使用满足条件的行进行变量计算

时间:2014-04-05 18:11:37

标签: r conditional

我正在尝试使用等于另一个值的行来计算变量的平均值:

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
等等......

2 个答案:

答案 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"]

更不用说mapplyaggregate

以下是R内置选项的概述:Using tapply for the subset group of data