【问题标题】:How do I transform a data.frame from vertical to horizontally grouped columns? [duplicate]如何将 data.frame 从垂直分组列转换为水平分组列? [复制]
【发布时间】:2019-12-07 01:27:44
【问题描述】:

假设我有以下data.frame:

a <- data.frame(group=c(3, 3, 3, 5, 5, 5), code=c(1, 2, 3, 1, 2, 3), val=c(10, 20, 30, 40, 50, 60), val2=c(100, 200, 300, 400, 500, 600))
a
    group code val val2
1     3    1  10  100
2     3    2  20  200
3     3    3  30  300
4     5    1  40  400
5     5    2  50  500
6     5    3  60  600

我想得到以下data.frame:

  group  "1.val" "2.val" "3.val" "1.val2" "2.val2" "3.val2"
1     3     10     20       30      100      200      300
2     5     40     50       60      400      500      600

重复帖子中的列名不正确。

注意:我更喜欢 base-R 解决方案,但其他想法会很有趣

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    pivot_wider 的选项来自 tidyr 的开发版

    library(tidyr)#  ‘0.8.3.9000’
    pivot_wider(a, names_from = code, values_from = c("val", "val2"))
    # A tibble: 2 x 7
    #  group val_1 val_2 val_3 val2_1 val2_2 val2_3
    #  <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl>  <dbl>
    #1     3    10    20    30    100    200    300
    #2     5    40    50    60    400    500    600
    

    如果我们需要列名中的 sep 为 .,请使用 names_sep

    pivot_wider(a, names_from = code, values_from = c("val", "val2"), names_sep=".")
    

    注意:通常,列名最好以标准格式字符而不是数字开头

    【讨论】:

      【解决方案2】:
      do.call(rbind, lapply(split(a, a$group), function(x) {
          cbind(data.frame(group = x$group[1]),
                setNames(data.frame(lapply(lapply(x[!names(x) %in% c("group", "code")], c),
                                           function(y) {
                                               lapply(y, list)
                                           })),
                         paste(rep(
                             names(x)[!names(x) %in% c("group", "code")], each = NROW(x)
                         ), x$code, sep = ".")))
      }))
      #  group val.1 val.2 val.3 val2.1 val2.2 val2.3
      #3     3    10    20    30    100    200    300
      #5     5    40    50    60    400    500    600
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-01
        • 1970-01-01
        • 2016-09-14
        • 1970-01-01
        • 1970-01-01
        • 2021-08-19
        • 1970-01-01
        • 2011-02-08
        相关资源
        最近更新 更多