2

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

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 包有更直接的方法(我还不太熟悉)

提前致谢!

4

2 回答 2

4

首先,我希望这rownames是一data.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 指出的那样,您的数据中也存在一个错误,避免了简单的聚合。,的组合year当然rowname必须是唯一的。否则,您需要一个聚合函数来确定非唯一组合的结果值。因此,我们假设数据中的第 6 行应为c 2010 4 1 8.

于 2014-02-12T13:42:53.780 回答
3

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

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
于 2014-02-12T13:48:07.547 回答