【发布时间】:2020-05-05 16:03:20
【问题描述】:
我正在寻找一种更简洁的解决方案,用于根据相应列值的条件为我的数据中的选择列创建一列行均值。
我创建了一些虚拟数据来说明我的意思。
每行是一组响应,每个编号为 A 和 B 的变量是来自组内相同响应的变量。
我想找到每一行的 A 值的平均值,但只有那些满足相应 B 值标准的人(例如> 17)。
df = data.frame(
A1 = c(15,15,1,5,8),
A2 = c(10,NA,5,3,10),
A3 = c(NA,NA,6,4,10),
A4 = c(NA,NA,5,5,NA),
B1 = c(55,40,29,33,42),
B2 = c(29,NA,18,11,26),
B3 = c(NA,NA,14,8,22),
B4 = c(NA,NA,11,16,NA))
> df
A1 A2 A3 A4 B1 B2 B3 B4
1 15 10 NA NA 55 29 NA NA
2 15 NA NA NA 40 NA NA NA
3 1 5 6 5 29 18 14 11
4 5 3 4 5 33 11 8 16
5 8 10 10 NA 42 26 22 NA
所以寻找这样的东西。
mean
1 12.500
2 15.000
3 3.000
4 5.000
5 9.333
到目前为止,我的解决方案是创建一个新列,复制我想要包含的所有 A 值,然后在这些列上执行 rowMeans:
for (i in 1:4){
A_inc = ifelse(df[,paste('B',i,sep='')] >= 17, df[,paste('A',i,sep='')],
NA)
df[, paste0('A_inc',i,sep = '')] <- A_inc
}
df$mean = rowMeans(df[grep('A_inc', names(df))], na.rm=TRUE)
> df
A1 A2 A3 A4 B1 B2 B3 B4 A_inc1 A_inc2 A_inc3 A_inc4 mean
1 15 10 NA NA 55 29 NA NA 15 10 NA NA 12.500000
2 15 NA NA NA 40 NA NA NA 15 NA NA NA 15.000000
3 1 5 6 5 29 18 14 11 1 5 NA NA 3.000000
4 5 3 4 5 33 11 8 16 5 NA NA NA 5.000000
5 8 10 10 0 42 26 22 3 8 10 10 NA 9.333333
这很有效,但是对于我更大的数据集以及来自更多列(B、C、D 等)的更复杂的条件来说很麻烦。我知道必须有更好的方法来做到这一点,并希望得到一些更好的方法。
【问题讨论】:
标签: r