对于示例(即使我的问题适用于更大的表),假设我有一个这种类型的数据框:
> df = data.frame(rep(NA,3),rep(NA,3),c(-6,5,NA),c(-2,-1,4),c(NA,2,-3),c(1,-3,2))
> colnames(df) = c("Positive mean","Negative mean","a","b","c","d")
> df
Positive mean Negative mean a b c d
1 NA NA -6 -2 NA 1
2 NA NA 5 -1 2 -3
3 NA NA NA 4 -3 2
我希望能够计算每一行,正值的平均值和负值的平均值。为了获得决赛桌:
> df
Positive mean Negative mean a b c d
1 1.0 -4 -6 -2 NA 1
2 3.5 -2 5 -1 2 -3
3 3.0 -3 NA 4 -3 2
所以,我想知道是否有办法不使用循环。
答案 0 :(得分:1)
在apply
(行)上使用MARGIN = 1
,选择相关值(子集正值或负值),然后选择mean
。在na.rm = TRUE
NA
删除mean
值
apply(df[,-(1:2)], MARGIN = 1, function(x) mean(x[x>0], na.rm = TRUE))
#[1] 1.0 3.5 3.0
apply(df[,-(1:2)], 1, function(x) mean(x[x<0], na.rm = TRUE))
#[1] -4 -2 -3
答案 1 :(得分:1)
这是一种“矢量化”方法:
df[[1]] <- rowMeans( df[3:6]*(df[3:6] >0) , na.rm=TRUE)
df[[2]] <- rowMeans( df[3:6]*(df[3:6] < 0) , na.rm=TRUE)
> df
Positive_mean Negative_mean a b c d
1 0.3333333 -2.666667 -6 -2 NA 1
2 1.7500000 -1.000000 5 -1 2 -3
3 2.0000000 -1.000000 NA 4 -3 2
在样式注释中,R的大多数常规用户不会在列名中留下空格,而是使用camelCase,“。”或“_”之一。