Вот базовый метод R с apply
, table
и prop.table
.
cbind(dat[1],
prop.table(t(apply(dat[-1], 1,
function(x) table(factor(x, levels=1:3)))), 1))
factor
, чтобы гарантировать, что вывод table
применяется к каждой строкевозвращает каждый потенциальный элемент (1:3
), даже если один или несколько уровней не соблюдены.Здесь apply
пробегает все строки и возвращает счетчики для каждого события, включая 0, когда событие не произошло.Поскольку выходные данные каждого вызова имеют одинаковую длину, apply
возвращает матрицу.Мы транспонируем матрицу и используем prop.table
, чтобы вычислить долю каждого события для каждой строки.Наконец, cbind
объединяет первый столбец с этой матрицей, возвращающей data.frame с желаемым выводом.
это возвращает
user 1 2 3
1 100 0.60 0.40 0.0
2 200 0.25 0.25 0.5
3 300 0.00 0.40 0.6
data
dat <-
structure(list(user = c(100L, 200L, 300L), col1 = c(1L, 1L, 2L
), col2 = 1:3, col3 = c(2L, 3L, 3L), col4 = c(2L, 3L, 3L), col5 = c(1L,
NA, 2L), col6 = c(NA, NA, NA)), .Names = c("user", "col1", "col2",
"col3", "col4", "col5", "col6"), class = "data.frame", row.names = c(NA,-3L))