2012-11-28 100 views
5

我在將data.frame中的列堆疊到一列中時遇到問題。 現在我的數據看起來是這樣的:將data.frame中的列堆疊到R中的一列中

id time black white red 
a  1  b1  w1  r1 
a  2  b2  w2  r2 
a  3  b3  w3  r3 
b  1  b4  w4  r4 
b  2  b5  w5  r5 
b  3  b6  w6  r6 

我想,這樣它看起來像這樣改造data.frame:

id time colour 
a  1  b1 
a  2  b2 
a  3  b3 
b  1  b4 
b  2  b5 
b  3  b6 
a  1  w1 
a  2  w2 
a  3  w3 
b  1  w4 
b  2  w5 
b  3  w6 
a  1  r1 
a  2  r2 
.  .  . 
.  .  . 
.  .  . 

我猜測,這個問題需要使用重新整形軟件包,但我不確定如何使用它在一列下堆疊多列。任何人都可以提供幫助嗎?

+0

你是否看了幫助'melt'在'reshape'(以上UPTODATE'reshape2'包 – mnel

回答

9

下面是重塑融化:

library(reshape) 
melt(x, id.vars=c('id', 'time'),var='color') 

並採用reshape2(的reshape向上最新的,更快的版本)的語法幾乎是相同的。

幫助文件包含有用的示例(請參閱?melt和指向melt.data.frame的鏈接)。

在你的情況,像下面的工作(假設你的data.frame被稱爲DF

library(reshape2) 
melt(DF, id.var = c('id','time'), variable.name = 'colour') 
+0

相關的問題:有沒有使用melt.data.frame堆棧的所有列的方式data.frame?設置id.vars = c()是否工作? – gvrocha

+0

@gvrocha確實如此。請注意,提供'c()'與不提供該選項不同。請參閱'?melt'的「Details」 –

5

既然你在你的標題提到「疊加」,你也可以看看在stack功能基礎R:

cbind(mydf[1:2], stack(mydf[3:5])) 
# id time values ind 
# 1 a 1  b1 black 
# 2 a 2  b2 black 
# 3 a 3  b3 black 
# 4 b 1  b4 black 
# 5 b 2  b5 black 
# 6 b 3  b6 black 
# 7 a 1  w1 white 
# 8 a 2  w2 white 
# 9 a 3  w3 white 
# 10 b 1  w4 white 
# 11 b 2  w5 white 
# 12 b 3  w6 white 
# 13 a 1  r1 red 
# 14 a 2  r2 red 
# 15 a 3  r3 red 
# 16 b 1  r4 red 
# 17 b 2  r5 red 
# 18 b 3  r6 red 

如果值的「黑」,「白」和「紅」列factor S,你需要首先轉換爲character值。

cbind(mydf[1:2], stack(lapply(mydf[3:5], as.character))) 
+0

我需要將所有列堆疊到一個2-col數據框中,並且您的解決方案能夠正常工作。 – phusion

相關問題