2013-10-13 93 views
9

我甚至不知道如何標題的問題正確![R重新排列數據幀:一些行的列

假設我有一個數據幀d:

當前數據幀:

d <- data.frame(sample = LETTERS[1:2], cat = letters[11:20], count = c(1:10)) 

    sample cat count 
1  A k  1 
2  B l  2 
3  A m  3 
4  B n  4 
5  A o  5 
6  B p  6 
7  A q  7 
8  B r  8 
9  A s  9 
10  B t 10 

,我想重新安排你的事情,使得每隻貓值變爲它自己的專欄,樣品仍然是一列(或成爲行名稱),計數將是價值在新的貓列,0,其中一個樣本不具有貓的計數。像這樣:

期望中的數據框佈局:

sample k l m n o p q r s t 
1  A 1 0 3 0 5 0 7 0 9 0 
2  B 0 2 0 4 0 6 0 8 0 10 

什麼是去了解它的最好方法?

這是據我已經得到:

for (i in unique(d$sample)) { 
    s <- d[d$sample==i,] 
    st <- as.data.frame(t(s[,3])) 
    colnames(st) <- s$cat 
    rownames(st) <- i 
} 

即通過在原始數據幀的樣本循環和調換爲每個樣本子集。因此,在這種情況下,我得到

k m o q s 
A 1 3 5 7 9 

l n p r t 
B 2 4 6 8 10 

這是我卡住。我用merge(),bind(),apply()等方法嘗試了一堆東西,但我似乎無法擊中正確的東西。另外,我不禁想知道上面的這個循環是否是必要的步驟 - 也許是用unstack()的東西?

不用說,我是新至R ...如果有人能幫助我,這將不勝感激!

PS原因,我試圖重新安排我的數據幀是在製作的價值更容易繪製的希望(即我要顯示在表格式的陰謀實際DF)。

謝謝!

+0

你想要做的是從「長」到「寬」去操作。這個問題之前已經被問及過很多次了。 – nograpes

+1

我的歉意。我通過這裏和谷歌搜索無盡的,我只是找不到任何我需要的東西(不知道如何調用我所需要的不是幫助)。我會尋找「長」/「寬」... – crs

回答

9

使用reshape從基R:

nn<-reshape(d,timevar="cat",idvar="sample",direction="wide") 
names(nn)[-1]<-as.character(d$cat) 
nn[is.na(nn)]<-0 
> nn 
    sample k l m n o p q r s t 
1  A 1 0 3 0 5 0 7 0 9 0 
2  B 0 2 0 4 0 6 0 8 0 10 
+0

謝謝,@Metrics - 這也可以! (現在我明白了nograpes在他的評論中所說的「長」和「寬」)。 Jilber的解決方案看起來更簡潔 - 其他方面有什麼不同?謝謝你的幫助!總是善於學習一些額外的東西。 – crs

+1

@crs,最大的區別是'xtabs'和'dcast'只能有一個「值」變量才能轉換爲寬格式。例如,在對原始「d」'data.frame':'d $ blah < - 11:20'進行一個小改動後,嘗試使用Metrics代碼的第一行。現在,試着用'dcast'或'xtabs'做同樣的事情。使用'dcast',首先'熔化'你的數據之後可能會有類似的輸出。使用'xtabs'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''必須分別地重塑變量並且'將它們連接在一起。 'reshape()'非常快,特別是與目前的'dcast'實現相比。 – A5C1D2H2I1M1N2O1R2T1

+1

度量標準:+1,但是我不知道是否會去重命名。在這種情況下,由於我在上面的評論中描述的擴展示例... – A5C1D2H2I1M1N2O1R2T1

12

從基本用dcast從reshape2包

> dcast(d, sample~cat, fill=0) 
    sample k l m n o p q r s t 
1  A 1 0 3 0 5 0 7 0 9 0 
2  B 0 2 0 4 0 6 0 8 0 10 

xtabs是另一種選擇

> xtabs(count~sample+cat, d) 
     cat 
sample k l m n o p q r s t 
    A 1 0 3 0 5 0 7 0 9 0 
    B 0 2 0 4 0 6 0 8 0 10 

如果你喜歡的輸出是一個data.frame,然後嘗試:

> as.data.frame.matrix(xtabs(count~sample+cat, d)) 
    k l m n o p q r s t 
A 1 0 3 0 5 0 7 0 9 0 
B 0 2 0 4 0 6 0 8 0 10 
+0

他,這看起來很整齊。但是,我應該提到,我正在尋找一種方法在標準(基本)R中執行此操作(因爲這不適用於我)。任何方式來做到這一點? (即使它更多參與?) – crs

+1

@crs看到我的編輯,我添加了R基礎解決方案。 –

+1

哦,血腥的h,非常感謝你!!!!這就是它!我還不能投票,但保佑你的心:) – crs