我有一个看起来像这样的数据框。我想通过仅选择满足特定条件(例如,<= 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
答案 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))