Я работаю с dataframe, как этот:столбец Count по строкам, избегая расплава/собрать
idno 08:00 08:05 08:10 08:15 08:20 08:25
1 1 Domestic Domestic Domestic Domestic Domestic Domestic
2 2 Leisure Leisure Leisure Leisure Leisure Leisure
3 3 Eat Eat Eat Eat Eat Eat
4 4 Paid Paid Paid Paid Paid Paid
5 5 Sleep Sleep Sleep Sleep Sleep Sleep
6 6 Eat Eat Eat Missing Missing Missing
7 7 Sleep Sleep Sleep Sleep Sleep Sleep
8 8 Paid Paid Paid Paid Paid Paid
9 9 Sleep Sleep Sleep Sleep Sleep Sleep
10 10 Child Care Child Care Child Care Travel Travel Travel
То, что я заинтересован в это краткое изложение этого dataframe, как это.
(выход хотел)
idno `Child Care` Domestic Eat Leisure Missing Paid Sleep Travel
* <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 0 6 0 0 0 0 0 0
2 2 0 0 0 6 0 0 0 0
3 3 0 0 6 0 0 0 0 0
4 4 0 0 0 0 0 6 0 0
5 5 0 0 0 0 0 0 6 0
6 6 0 0 3 0 3 0 0 0
7 7 0 0 0 0 0 0 6 0
8 8 0 0 0 0 0 6 0 0
9 9 0 0 0 0 0 0 6 0
10 10 3 0 0 0 0 0 0 3
Что я вообще делаю это просто:
melt(df, id.vars = 'idno') %>% count(idno, value) %>% spread(value, n, 0)
Однако, мне интересно, если есть более простой, чтобы сделать это. Моя проблема в том, что я работаю с очень большой базой данных и использую melt
, затем count
, тогда spread
может быть немного медленным.
Есть ли прямой путь к count
столбцам (распределение переменной) для каждой строки, предпочтительно с использованием data.table
.
setDT(df)[,.N,by=] #
что-то вроде by
колонок для каждой строки?
df = structure(list(idno = 1:10, `08:00` = c("Domestic", "Leisure",
"Eat", "Paid", "Sleep", "Eat", "Sleep", "Paid", "Sleep", "Child Care"
), `08:05` = c("Domestic", "Leisure", "Eat", "Paid", "Sleep",
"Eat", "Sleep", "Paid", "Sleep", "Child Care"), `08:10` = c("Domestic",
"Leisure", "Eat", "Paid", "Sleep", "Eat", "Sleep", "Paid", "Sleep",
"Child Care"), `08:15` = c("Domestic", "Leisure", "Eat", "Paid",
"Sleep", "Missing", "Sleep", "Paid", "Sleep", "Travel"), `08:20` = c("Domestic",
"Leisure", "Eat", "Paid", "Sleep", "Missing", "Sleep", "Paid",
"Sleep", "Travel"), `08:25` = c("Domestic", "Leisure", "Eat",
"Paid", "Sleep", "Missing", "Sleep", "Paid", "Sleep", "Travel"
)), .Names = c("idno", "08:00", "08:05", "08:10", "08:15", "08:20",
"08:25"), row.names = c(NA, 10L), class = "data.frame")
'библиотека (data.table); dcast (melt (setDT (df), id = 1), idno ~ value) ' – Jaap
Это все еще интересное решение, спасибо @Jaap – giacomo
альтернативный вариант (на основе дубликата-цели):' xtabs (~ idno + value, data. table :: melt (df, id = 1)) ' – Jaap