如何对数据帧中的每一行执行条件求和/均值

时间:2019-05-22 03:11:32

标签: r

我有一个看起来像这样的数据框。我想通过仅选择满足特定条件(例如,<= 500)的列,而排除第一列和等于0和-1的值,来对每行的值求和/平均,然后将其输出到新列中。

Student   Resp_1   Resp_2   Resp_3   Resp_4   Resp_5 
1         894      -1       324      -1       589 
2         -1       -1       548      841      0 
3         285      216      -1       986      0

我尝试排除第一列以及等于-1和0的列,但输出值基于出现次数。

df$Sums <- rowSumns(df[-1] != "-1" & df[-1] != "0")
df$Means <- rowMeans(df[-1] != "-1" & df[-1] != "0")

我希望输出为:

Student   Resp_1   Resp_2   Resp_3   Resp_4   Resp_5   Sums   Means
1         894      -1       324      -1       589      1807   602
2         -1       -1       548      841      0        1389   695
3         285      216      -1       986      0        1487   496

但是它却给了我

Student   Resp_1   Resp_2   Resp_3   Resp_4   Resp_5   Sums   Means
1         894      -1       324      -1       589      3      1
2         -1       -1       548      841      0        2      1
3         285      216      -1       986      0        3      1

1 个答案:

答案 0 :(得分:1)

我们可能需要将replace的值设置为NA,然后使用rowSums获得na.rm = TRUE

newDF <- replace(df1[-1], df1[-1] == -1 |df1[-1] == 0, NA)
df1$Sums <- rowSums(newDF, na.rm = TRUE)
df1$Means <- rowMeans(newDF, na.rm = TRUE)
df1
#  Student Resp_1 Resp_2 Resp_3 Resp_4 Resp_5 Sums    Means
#1       1    894     -1    324     -1    589 1807 602.3333
#2       2     -1     -1    548    841      0 1389 694.5000
#3       3    285    216     -1    986      0 1487 495.6667

注意:如果我们需要为“均值”添加round值,请使用round(rowMeans(..


在OP的代码中,rowSums是在仅具有TRUE / FALSE或1/0值的逻辑matrix上采用的

数据

df1 <- structure(list(Student = 1:3, Resp_1 = c(894L, -1L, 285L), Resp_2 = c(-1L, 
-1L, 216L), Resp_3 = c(324L, 548L, -1L), Resp_4 = c(-1L, 841L, 
986L), Resp_5 = c(589L, 0L, 0L)), class = "data.frame", row.names = c(NA, 
-3L))