我在将data.frame中的列堆叠到一列时遇到问题。 现在我的数据看起来像这样:
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
. . .
. . .
. . .
我猜这个问题需要使用reshape包,但我不确定如何使用它来堆叠一列下的多个列。任何人都可以提供帮助吗?
答案 0 :(得分:11)
来自重塑的融化:
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')
答案 1 :(得分:6)
由于您在标题中提到“堆叠”,您还可以查看基础R中的stack
函数:
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
,则您需要先将它们转换为character
值。
cbind(mydf[1:2], stack(lapply(mydf[3:5], as.character)))