【问题标题】:stacking columns in data.frame into one column in R将data.frame中的列堆叠成R中的一列
【发布时间】:2012-11-15 19:59:32
【问题描述】:

我在将 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 包,但我不确定如何使用它来在一列下堆叠多列。任何人都可以提供帮助吗?

【问题讨论】:

  • 您是否查看过reshape(或更新的reshape2 软件包中的melt 的帮助。

标签: r dataframe reshape


【解决方案1】:

这是从重塑中融化的:

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')

【讨论】:

  • 相关问题:有没有办法使用 melt.data.frame 堆叠 data.frame 的所有列?设置 id.vars=c() 有效吗?
  • @gvrocha 确实如此。请注意,提供c() 与不提供选项不同。请参阅?melt 的“详细信息”部分。
【解决方案2】:

由于您在标题中提到“堆叠”,您还可以查看base 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

如果“黑色”、“白色”和“红色”列中的值为factors,您需要先将它们转换为character 值。

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

【讨论】:

  • 我需要将所有列堆叠到 2-col 数据框中,您的解决方案有效。谢谢。
猜你喜欢
  • 2016-02-27
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 2020-02-06
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
相关资源
最近更新 更多