2017-01-27 3 views
2

Я работаю с 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") 
+1

'библиотека (data.table); dcast (melt (setDT (df), id = 1), idno ~ value) ' – Jaap

+0

Это все еще интересное решение, спасибо @Jaap – giacomo

+1

альтернативный вариант (на основе дубликата-цели):' xtabs (~ idno + value, data. table :: melt (df, id = 1)) ' – Jaap

ответ

4

Вы можете попробовать mtabulate из qdapTools,

library(qdapTools) 

mtabulate(split(df[-1], seq(nrow(df)))) 

# Child Care Domestic Eat Leisure Missing Paid Sleep Travel 
#1   0  6 0  0  0 0  0  0 
#2   0  0 0  6  0 0  0  0 
#3   0  0 6  0  0 0  0  0 
#4   0  0 0  0  0 6  0  0 
#5   0  0 0  0  0 0  6  0 
#6   0  0 3  0  3 0  0  0 
#7   0  0 0  0  0 0  6  0 
#8   0  0 0  0  0 6  0  0 
#9   0  0 0  0  0 0  6  0 
#10   3  0 0  0  0 0  0  3 
+0

очень интересно спасибо – giacomo

Смежные вопросы