2017-04-07 26 views
2

对于示例(即使我的问题适用于一个更大的表)的行手段,让我们说我有这种类型的数据帧:如何数据框中,如何计算条件值

> 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 

所以,我想知道是否有办法做到这一点,而不使用循环。

回答

1

MARGIN = 1(行)上使用apply,选择相关值(子集正值或负值),并采取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 
+0

为什么需要排序? –

+0

使用na.rm = TRUE更高效(且不太模糊) –

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,“。”或“_”中的一个。