【问题标题】:reshape a dataframe R重塑数据框 R
【发布时间】:2014-03-10 20:39:05
【问题描述】:

我正面临数据框的重塑问题。它有更多的行和列。简化后,它的结构如下:

rownames    year    x1  x2  x3
a           2000    2   6   11
b           2000    0   4   2
c           2000    0   3   5
a           2010    2   6   11
b           2010    0   0   0
c           2020    4   1   8
a           2020    10  1   7
b           2020    8   4   10
c           2020    22  1   16

我想提供一个数据框,其中只有一行用于变量“year”,复制后续列中的 x1、x2、x3 值,并使用行名和 x- 之间的组合重命名列多变的。它应该是这样的:

year  a_x1  a_x2  a_x3  b_x1  b_x2  b_x3  c_x1  c_x2  c_x3
2000  2     6     11    0     4     2     0     3     5
2010  2     6     11    0     0     0     4     1     8
2020  10    1     7     8     4     10    22    1     16

我想使用后续的 cbind() 函数,但由于我必须为数千行和数百列执行此操作,我希望 reshape 包有更直接的方法(我还不太熟悉)

提前致谢!

【问题讨论】:

  • 请使用dput(sample_data),以便用户可以将他们的建议应用于您正在查看的相同数据。
  • 你想如何处理重复值?还是我应该根据您的示例输出假设这是一个错误?
  • @HansRoggeman 在这种情况下它是 100% 可重现的:dt <- read.table( text="...", , header = TRUE ),只需将 ... 替换为复制的文本。

标签: r reshape reshape2 melt cbind


【解决方案1】:

首先,我希望rownamesdata.frame 列,而不是data.frame 的行名。否则你会因为值的非唯一性而遇到问题。

我认为您的主要问题是,您的 data.frame 并未完全熔化:

library(reshape2)

dt <- melt( dt, id.vars=c("year", "rownames") )
head(dt)
   year rownames variable value
1  2000        a       x1     2
2  2000        b       x1     0
3  2000        c       x1     0
4  2010        a       x1     2
...

dcast( dt, year ~ rownames + variable )
  year a_x1 a_x2 a_x3 b_x1 b_x2 b_x3 c_x1 c_x2 c_x3
1 2000    2    6   11    0    4    2    0    3    5
2 2010    2    6   11    0    0    0    4    1    8
3 2020   10    1    7    8    4   10   22    1   16

编辑:

正如@spdickson 指出的那样,您的数据中也存在一个错误,避免了简单的聚合。 yearrowname 的组合当然必须是唯一的。否则,您需要一个聚合函数来确定非唯一组合的结果值。所以我们假设你数据中的第 6 行应该是c 2010 4 1 8

【讨论】:

  • 领先我 15 秒... +1
  • 他的示例数据集中的一个错误导致dcast() 使用长度聚合了您的结果。如果您将2020 的第一个实例更改为2010,那应该会修复它,以便您获得他想要的结果。
  • 谢谢,它有效!我的意思是rownames 作为data.frame 的行名。但是,我提取了 rownames 向量并作为列插入。尽管我有数百个years,但年行名称的组合在我的情况下总是相同的。
【解决方案2】:

您可以尝试使用 base R 中的reshape(),而无需进一步融合您的数据框:

df1 <- read.table(text="rownames    year    x1  x2  x3
a           2000    2   6   11
b           2000    0   4   2
c           2000    0   3   5
a           2010    2   6   11
b           2010    0   0   0
c           2010    4   1   8
a           2020    10  1   7
b           2020    8   4   10
c           2020    22  1   16",header=T,as.is=T)

reshape(df1,direction="wide",idvar="year",timevar="rownames")
#   year x1.a x2.a x3.a x1.b x2.b x3.b x1.c x2.c x3.c
# 1 2000    2    6   11    0    4    2    0    3    5
# 4 2010    2    6   11    0    0    0    4    1    8
# 7 2020   10    1    7    8    4   10   22    1   16

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    相关资源
    最近更新 更多