Как я могу вычислить средства строк, исключая нулевые значения из строк в кадре данных

Я пытаюсь вычислить среднее значение каждой строки в моем кадре данных. В каждой строке есть нули, и я хочу исключить их из расчета. Я не хочу удалять всю строку, но только нули и вычислять среднее значение повторных значений в каждой строке. Если строка имеет все нулевые значения, то результат должен быть равен нулю.

Ответ 1

Как насчет

nzmean <- function(x) {
    if (all(x==0)) 0 else mean(x[x!=0])
}
apply(mydata,1,nzmean)

?

Мне кажется, что может быть немного быстрее сделать

nzmean <- function(x) {
    zvals <- x==0
    if (all(zvals)) 0 else mean(x[!zvals])
}

то есть. старайтесь избегать сравнения x с нулем в два раза.

Ответ 2

Или то, что вы могли бы сделать, это присвоить NA нулю, что эффективно, что вы хотите сделать. Некоторые примеры данных:

spam = matrix(runif(100), 10, 10)
spam[1,2] = 0
spam[4,3] = 0
spam[10,] = 0
spam[spam == 0] <- NA

и используйте rowMeans, ifelse должен проверить, что строки полностью NA. Аргумент na.rm важен здесь:

mean_values = rowMeans(spam, na.rm = TRUE)
mean_values = ifelse(is.na(mean_values), 0, mean_values)