如何计算数据帧,如何计算条件值的行方式

时间:2017-04-07 20:40:41

标签: r dataframe

对于示例(即使我的问题适用于更大的表),假设我有一个这种类型的数据框:

> 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

所以,我想知道是否有办法不使用循环。

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,“。”或“_”之一。