2013-07-22 70 views
2

我有一個包含100個變量和400,000個事務的大型數據集。下面是一個簡單的數據:重塑大數據

a <- structure(list(ID = c("A1", "A2", "A3", "A1", "A1", "A2", "A4", "A5", "A2", "A3"), 
Type = c("A", "B", "C", "A", "A", "A", "B", "B", "C", "B"), 
Alc = c("E", "F", "G", "E", "E", "E", "F", "F", "F", "F"), 
Com = c("Y", "N", "Y", "N", "Y", "Y", "Y", "N", "N", "Y")), 
.Names = c("ID", "Type", "Alc", "Com"), row.names = c(NA, -10L), class = "data.frame") 
a 

    ID Type Alc Com 
1 A1 A E Y 
2 A2 B F N 
3 A3 C G Y 
4 A1 A E N 
5 A1 A E Y 
6 A2 A E Y 
7 A4 B F Y 
8 A5 B F N 
9 A2 C F N 
10 A3 B F Y 

我喜歡拿數據集是這樣的:

ID  Type_A Type_B Type_C Alc_E Alc_F Alc_G Com_Y Com_N 
A1   3  0  0  3  0  0  2  1 
A2   1  1  1  1  2  0  1  2 
A3   0  1  1  0  1  1  2  0 
A4   0  1  0  0  1  0  1  0 
A5   0  1  0  0  1  0  0  1 

我使用從「reshape2」包「dcast」功能。但結果不符合我的要求。

在此先感謝。

回答

5

假設你data.frame是DF:

require(reshape2) 
dcast(melt(DF, id.var=c("ID")), ID ~ variable + value, value.var="value") 

Aggregation function missing: defaulting to length 
    ID Type_A Type_B Type_C Alc_E Alc_F Alc_G Com_N Com_Y 
1 A1  3  0  0  3  0  0  1  2 
2 A2  1  1  1  1  2  0  2  1 
3 A3  0  1  1  0  1  1  0  2 
4 A4  0  1  0  0  1  0  0  1 
5 A5  0  1  0  0  1  0  1  0 
+1

當你快! –

+0

@GavinSimpson,謝謝:)。 – Arun

2

因爲你似乎只是對於每列製表至a$ID,你也可以只用tablelapply,就像這樣:

do.call(cbind, lapply(a[-1], function(x) table(a[[1]], x))) 
# A B C E F G N Y 
# A1 3 0 0 3 0 0 1 2 
# A2 1 1 1 1 2 0 2 1 
# A3 0 1 1 0 1 1 0 2 
# A4 0 1 0 0 1 0 0 1 
# A5 0 1 0 0 1 0 1 0 

這些名稱幾乎沒有那麼漂亮,但可以通過自定義lapply命令來修復:

do.call(cbind, 
     lapply(names(a[-1]), function(x) { 
      temp <- table(a[[1]], a[[x]]) 
      colnames(temp) <- paste(x, colnames(temp), sep = "_") 
      temp 
     })) 
# Type_A Type_B Type_C Alc_E Alc_F Alc_G Com_N Com_Y 
# A1  3  0  0  3  0  0  1  2 
# A2  1  1  1  1  2  0  2  1 
# A3  0  1  1  0  1  1  0  2 
# A4  0  1  0  0  1  0  0  1 
# A5  0  1  0  0  1  0  1  0