2017-05-31 66 views
0

我有兩列 - 唯一ID列id和旅行當天day。我的目標是創建每天每ID計數的矩陣(即使計數爲零包括所有天)使用兩個變量創建計數矩陣

> test 
    id day 
1 3 3 
2 4 4 
3 1 4 
4 2 3 
5 2 5 
6 2 4 
7 1 1 
8 5 4 
9 1 1 
10 3 2 
11 2 2 
12 4 2 
13 2 4 
14 2 5 
15 4 5 
16 3 4 
17 5 3 
18 3 2 
19 5 5 
20 3 4 
21 1 3 
22 2 3 
23 2 5 
24 5 2 
25 3 2 

輸出應該是以下,其中行表示id和列代表day

> output 
    1 2 3 4 5 
1 2 0 1 1 0 
2 0 1 2 2 3 
3 0 3 1 2 0 
4 0 1 0 1 1 
5 0 1 1 1 1 

我曾嘗試與reshape

output <- reshape2::dcast(test, day ~ id, sum) 

以下,但它引發以下錯誤:

Error in unique.default(x) : unique() applies only to vectors 

爲什麼會發生這種情況,dplyr或使用base R的正確解決方案是什麼?任何提示將不勝感激。

下面是數據:

> dput(test) 
structure(list(id = c(3, 4, 1, 2, 2, 2, 1, 5, 1, 3, 2, 4, 2, 
2, 4, 3, 5, 3, 5, 3, 1, 2, 2, 5, 3), day = c(3, 4, 4, 3, 5, 4, 
1, 4, 1, 2, 2, 2, 4, 5, 5, 4, 3, 2, 5, 4, 3, 3, 5, 2, 2)), .Names = c("id", 
"day"), row.names = c(NA, -25L), class = "data.frame") 
+6

'table(d)'應該給你你想要的輸出。 – Lamia

+0

當然這是重複的。 –

回答

0
ans <- tapply(test$id, test$day, 
       function(x) { 
       y <- table(x) 
       z <- rep(0, 5) 
       z[as.numeric(names(y))] <- y 
       z 
       }) 
do.call("cbind", ans) 
    1 2 3 4 5 
[1,] 2 0 1 1 0 
[2,] 0 1 2 2 3 
[3,] 0 3 1 2 0 
[4,] 0 1 0 1 1 
[5,] 0 1 1 1 1 
1
更容易

看到什麼回事字符變量

id <- c('a', 'a', 'b', 'f', 'b', 'a') 
day <- c('x', 'x', 'x', 'y', 'z', 'x') 

test <- data.frame(id, day) 



output <- as.data.frame.matrix(table(test)) 

這是做最簡單的方法......使用table()功能然後轉換爲data.frame