суммирование доли записей в каждой строке кадра данных - PullRequest
0 голосов
/ 25 апреля 2018

У меня большой фрейм данных, в котором есть несколько столбцов со значениями «NA».Я хочу суммировать каждую строку в процентах.
скажем: df

user col1 col2 col3 col4 col5 col6
 100   1    1    2   2    1    NA
 200   1    2    3   3    NA   NA
 300   2    3    3   3    2    NA

Я хочу суммировать user строк на основе процента от общего числа членов.
например,Пользователь: 100 имеет 3/5 события 1 и 2/5 события 2.

summary_df:

user event1 event2 event3
100    3/5   2/5    0
200    1/4   1/4    2/4
300    0     2/5    3/5

также полезно использовать процент для каждого события.
как можноЯ делаю это в R?

1 Ответ

0 голосов
/ 25 апреля 2018

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