【问题标题】:Split Data Every N Columns and rbind Using R [duplicate]每 N 列拆分数据并使用 R 进行 rbind [重复]
【发布时间】:2019-07-19 15:22:32
【问题描述】:

我有一个数据框。在我的数据集中。 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),然后对每个子集进行 rbind。在 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(setDT(df), measure = patterns("^a", "^b", "^c"), value.name = c("a", "b", "c"))
  • 我认为您缺少c1
  • 我添加了 C1。谢谢
  • akrun 你能发布你的答案,这样我就可以给你信任。这效果很好

标签: r dplyr data.table tidyverse


【解决方案1】:

一个选项是 melt from data.table 可以采用多个 measure patterns

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

【讨论】:

    【解决方案2】:

    仅使用 R 基:

    vector = c('a', 'b', 'c')
    df.new = list()
    for (variable in vector) {
      var.group = grep(variable, colnames(df))
      df.new[[variable]] = stack(df[, var.group])[,1]
    }
    df.new =  as.data.frame(df.new)
    df.new = cbind.data.frame(df.new, date=df$date)
    print(df.new)
                      a          b          c       date
        1  -0.537778534 -0.5804655 -0.8866349 2019-05-05
        2  -1.891995399 -0.6454293 -0.4255403 2019-05-06
        3   0.710379004 -0.7718716 -0.5845242 2019-05-07
        4  -0.349523645 -1.4444619 -0.9783922 2019-05-08
        5  -0.558693367  0.2850591  1.3180083 2019-05-05
        6  -2.153964601 -1.8949987 -0.4039877 2019-05-06
        7  -1.652931301  0.6643048 -0.4555994 2019-05-07
        8  -0.657440968 -0.1361812 -0.3027680 2019-05-08
        9   1.423518807 -0.9561343 -0.8997554 2019-05-05
        10 -0.440000490  1.4045568 -1.3441805 2019-05-06
        11 -0.004766291 -0.5683855  0.2077830 2019-05-07
        12 -0.959219039 -0.1366399 -0.3789737 2019-05-08
    

    【讨论】:

    • 问题是我有2000个变量!这只是一个样本。 Akrun 的回答成功了!
    • 确实,如果将来对任何人有用,我会更新我对 R-base 的答案
    猜你喜欢
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    相关资源
    最近更新 更多