This question already has answers here:
Reshaping multiple sets of measurement columns (wide format) into single columns (long format)

(7个答案)


4个月前关闭。




我有一个数据框。在我的数据集中。 a,a1和a2是完全相同的变量。但是,当您在r中具有相同的名称时,它将在名称末尾自动添加1。
  df = data.frame(a = rnorm(4), b = rnorm(4), c = rnorm(4), a1 = rnorm(4), b1 = rnorm(4), c1 = rnorm(4), a2 = rnorm(4),
                b2 = rnorm(4), c2 = rnorm(4), date = seq(as.Date("2019-05-05"),as.Date("2019-05-08"), 1))
  print(df)



             a          b          c         a1         b1         a2         b2         c2       date
1 -1.0938097  1.3948486  1.2805904  1.6187439  1.0200681 -1.4335761 -0.4583526  0.3825598 2019-05-05
2 -0.3195004 -1.1281779 -2.1905902 -1.1693616 -0.9612850 -0.7502631 -0.5637997  0.3072459 2019-05-06
3 -0.2135026  0.7015042 -0.8271073 -0.1115213 -1.0378507  0.5620332 -2.0615450  1.7363142 2019-05-07
4  1.0413566 -1.1983207  0.9262545  0.6454741 -0.7874252  0.1904461  0.8970132 -1.4173619 2019-05-08

我想将此数据转换为长格式,在该格式中,我将数据帧分为多个块(a-c,a1-c1,a2-c2),然后重新绑定每个子集。 data.frame的末尾有一个称为date的关键列。

我希望该表成为以下内容。
       a          b          c       date
1   1.70236896  0.1847794  1.0642016 2019-05-05
2  -1.84604746  1.1229081  1.0550992 2019-05-06
3  -0.70185143 -0.8527223  1.3261573 2019-05-07
4  -0.47930296  0.2822001 -0.3271825 2019-05-08
5  -0.09950265 -0.1881748 -0.7482557 2019-05-05
6   0.72087483  2.0053211  1.1154889 2019-05-06
7  -1.83254875 -0.4060090 -0.2664467 2019-05-07
8  -0.17379130  0.6302901  1.5287194 2019-05-08
9   1.72706128 -1.4701842  1.1615761 2019-05-05
10  2.00246599  0.1306764 -1.8767190 2019-05-06
11  0.05263048  0.1173080  0.4293342 2019-05-07
12 -0.70024619  1.0677009 -0.2974141 2019-05-08

谢谢。

最佳答案

一个选项是melt中的data.table,它可以采用多个measure patterns

library(data.table)
melt(setDT(df), measure = patterns("^a", "^b", "^c"),
         value.name = c("a", "b", "c"))[, variable := NULL][]

10-04 23:19
查看更多