【问题标题】:Combining multiple column/ stacking multiple columns组合多列/堆叠多列
【发布时间】:2020-03-26 17:23:34
【问题描述】:

所以我有 9 列

     a b c d e f g h i     
  1  1 t p 1 h p 1 v g
  2  2 e h 2 j m 2 c f 
  3  3 f g 3 k l 3 b d

我想知道我怎样才能让它们像这样

     a b c
   1 1 t p
   2 2 e h
   3 3 f g
   4 1 h p
   5 2 j m
   6 3 k l
   7 1 v g
   8 2 c f
   9 3 b d

【问题讨论】:

    标签: r dataframe multiple-columns


    【解决方案1】:

    我们可以通过在list 的vectors 中指定要组合在一起的列来使用base R 中的reshape

    out <- reshape(df1, direction = 'long', 
        varying = list(c('a', 'd', 'g'), c('b', 'e', 'h'),
              c('c', 'f', 'i')))[c('a', 'b', 'c')]
    row.names(out) <- NULL
    out
    #  a b c
    #1 1 t p
    #2 2 e h
    #3 3 f g
    #4 1 h p
    #5 2 j m
    #6 3 k l
    #7 1 v g
    #8 2 c f
    #9 3 b d
    

    或者使用来自data.table的melt

    library(data.table)
    melt(setDT(df1), measure = list(c('a', 'd', 'g'), c('b', 'e', 'h'),
           c('c', 'f', 'i')), value.name = c('a', 'b', 'c'))[, variable := NULL][]
    

    数据

    df1 <- structure(list(a = 1:3, b = c("t", "e", "f"), c = c("p", "h", 
    "g"), d = 1:3, e = c("h", "j", "k"), f = c("p", "m", "l"), g = 1:3, 
        h = c("v", "c", "b"), i = c("g", "f", "d")), 
        class = "data.frame", row.names = c("1", 
    "2", "3"))
    

    【讨论】:

      【解决方案2】:

      涉及purrr 的一个选项可能是:

      map_dfc(.x = split.default(df, rep(1:3, length.out = length(df))),
              ~ stack(.)[1]) %>%
       setNames(c("a", "b", "c"))
      
        a b c
      1 1 t p
      2 2 e h
      3 3 f g
      4 1 h p
      5 2 j m
      6 3 k l
      7 1 v g
      8 2 c f
      9 3 b d
      

      【讨论】:

        猜你喜欢
        • 2021-02-18
        • 2020-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-11
        • 2020-06-25
        • 1970-01-01
        相关资源
        最近更新 更多