Вы можете сделать это с помощью
# Generate some fake data
set.seed(1)
n = 10
k = 5
x = matrix(runif(n * k), n, k)
x[x < 0.5] = 0
# Get number of nonzero entries in each row
nonzeros = apply(x, 1, function(z) sum(z != 0))
# Take row sums and divide by number of non-zero entries
rowSums(x) / nonzeros
Или, используя предоставленный вами фрейм data.frame, он будет выглядеть так:
# The data
x = structure(list(a = c(1L, 0L, 0L), b = c(2L, 0L, 1L), c = c(0L,
2L, 0L), classes = structure(1:3, .Label = c("a", "b", "c"), class = "factor")), .Names = c("a",
"b", "c", "classes"), class = "data.frame", row.names = c(NA,
-3L))
column = which(names(x) == "classes")
nonzeros = apply(x[-column], 1, function(z) sum(z != 0))
rowSums(x[-column]) / nonzeros