2012-11-28 66 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

相关问题