Как выполнить условную сумму / среднее для каждой строки во фрейме данных - PullRequest
1 голос
/ 22 мая 2019

У меня есть фрейм данных, который выглядит примерно так.Я хотел бы суммировать / усреднять значения каждой строки, выбирая только столбцы, которые удовлетворяют определенному условию (например, <= 500), исключая первый столбец и значения, равные 0 и -1, и выводить его в новом столбце.</p>

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 Ответ

1 голос
/ 22 мая 2019

Нам может понадобиться 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 ed для «Средства», используйте round(rowMeans(..


В коде ОП rowSums берется из логического matrix, который имеет только ИСТИНА / ЛОЖЬ или значения 1/0

данные

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...