【问题标题】:Merge dataframe based on column in R基于R中的列合并数据框
【发布时间】:2015-01-17 01:06:29
【问题描述】:

您好,我有以下数据框:

CSS_WEEK_END_DATE   BV  BVG  BVH BVG1 BVG2 BVG3 BVG4 BVH1 BVH2 BVH3 BVH4 BVH5 BVG11 BVG12 BVG13 BVG14 BVG15 BVG16 BVG21 BVG22 BVG23 BVG24 BVG25 BVG31 BVG32 BVG34
1        2012-01-13 28.0 28.3 27.7 28.6 28.7 27.3 28.7 29.5 27.2 26.5 27.8 27.5  34.3  30.7  29.8  25.9  25.7  28.0  29.9  33.9  26.2  32.0  24.4  29.3  24.0  26.9
2        2012-01-20 28.8 29.5 28.4 31.8 29.2 28.2 28.9 30.0 27.8 27.4 28.0 28.7  37.9  34.3  33.3  30.7  27.1  31.6  28.6  32.6  29.3  32.8  24.5  31.5  24.0  27.8
3        2012-01-27 28.2 28.6 27.9 30.7 28.4 27.4 28.0 29.7 27.5 26.9 27.4 28.0  34.8  29.3  32.8  29.5  28.3  31.3  26.9  33.2  27.0  31.3  25.4  30.8  23.4  25.9
4        2012-02-03 28.1 28.2 28.1 30.6 27.6 27.0 27.8 30.5 27.5 25.9 27.5 28.9  37.9  29.1  31.7  30.0  26.8  31.9  26.4  32.3  26.6  31.3  23.5  30.5  21.7  26.3
5        2012-02-10 27.9 28.1 27.7 30.5 27.9 27.0 27.5 30.4 26.8 26.2 26.4 28.5  35.9  30.0  30.8  30.5  25.8  32.9  26.1  32.1  26.2  31.4  25.2  30.6  24.1  25.6
6        2012-02-17 26.4 26.8 26.0 30.6 26.8 24.0 26.5 29.1 25.6 24.3 24.8 26.4  36.1  31.5  29.6  30.0  25.5  33.1  25.2  32.6  24.8  30.3  23.1  26.2  20.3  22.5

我想把这个数据集转换成这个:

CSS_WEEK_END_DATE   patch   Drive.Per.Task
13/01/2012              BV  28
20/01/2012              BV  28.8
27/01/2012              BV  28.2
03/02/2012              BV  28.1
10/02/2012              BV  27.9
13/01/2012              BVG 28.3
20/01/2012              BVG 29.5
27/01/2012              BVG 28.6
03/02/2012              BVG 28.2
10/02/2012              BVG 28.1
13/01/2012              BVH 27.7
20/01/2012              BVH 28.4
27/01/2012              BVH 27.9
03/02/2012              BVH 28.1
10/02/2012              BVH 27.7
...

如何在 R 中以最佳方式执行此操作。我目前不得不在 Excel 中复制和粘贴,这是一项痛苦的任务,因为我有很多补丁,如上面的示例所示

【问题讨论】:

    标签: r dataframe transform rows multiple-columns


    【解决方案1】:

    如果你的数据框名称是 DF,你可以试试这样的:

    library(reshape2)
    melt(DF, id='CSS_WEEK_END_DATE', value.name='Drive.Per.Task', variable.name='patch')
    

    如果你没有库reshape2,你可以这样安装:

    install.packages('reshape2')
    

    如果这有帮助,请告诉我。

    【讨论】:

    • 这正是我想要的。谢谢你的帮助! :)
    • 没问题。乐意效劳。请接受答案以关闭主题。
    【解决方案2】:

    这是“reshape2”包的替代方案(由同一包作者提供):

    library(dplyr)
    library(tidyr)
    new <- mydf %>% gather(patch, Drive.Per.Task, BV:BVG34)
    head(new)
    #   CSS_WEEK_END_DATE patch Drive.Per.Task
    # 1        2012-01-13    BV           28.0
    # 2        2012-01-20    BV           28.8
    # 3        2012-01-27    BV           28.2
    # 4        2012-02-03    BV           28.1
    # 5        2012-02-10    BV           27.9
    # 6        2012-02-17    BV           26.4
    

    在base R中,你可以试试stack:

    out <- cbind(CSS_WEEK_END_DATE = mydf[[1]], 
                 setNames(stack(mydf[-1]), 
                          c("Drive.Per.Task", "patch")))
    head(out)
    #   CSS_WEEK_END_DATE Drive.Per.Task patch
    # 1        2012-01-13           28.0    BV
    # 2        2012-01-20           28.8    BV
    # 3        2012-01-27           28.2    BV
    # 4        2012-02-03           28.1    BV
    # 5        2012-02-10           27.9    BV
    # 6        2012-02-17           26.4    BV
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-06
      • 2017-05-24
      • 1970-01-01
      • 2020-07-17
      • 2018-01-30
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多