2013-04-22 93 views
3

我想長的數據格式轉換成寬的數據形式R. 舉例來說,我有以下的數據幀:轉換長數據幀到寬的數據幀

a = rep(c("A","B","C","D"),4) 
b = rep(c("COL1","COL2","COL3","COL4"),4) 
val = 101:116 
df = as.data.frame(cbind(a,b,val)) 
df 

我想看到的結果作爲:

row <- as.list(levels(df$a)) 
col <- as.list(levels(df$b)) 

test <- data.frame() 

i = 1 

    for (j in 1:4) { 
    for(k in 1:4){ 
     test[j,k] = df$val[i] 
     i = i + 1 
    } 
    } 

colnames(test) <- c("COL1","COL2","COL3","COL4") 
rownames(test) <- c("A","B","C","D") 
test 

希望如果你可以建議一個優雅的解決方案,使用一些方便的功能。 謝謝, 卡西姆

回答

3

如果你的ID列,其中真正獨特的,你可以使用重塑

reshape(data=df, direction = "wide", idvar = "a", timevar = "b", v.names = "val") 

不過,由於他們不是唯一的,下面將讓你對你的方式。

​​
3

使用unstack

df.out <- unstack(df, val ~ b) 
rownames(df.out) <- unique(df$a) 

使用reshape2,它需要有點一招得到一個id列,因爲你的標識符不唯一標識值。

dcast(transform(df, id=rep(1:4, each=4)), id ~ b, value.var="val") 

然後您可以添加類似的行名稱。