【问题标题】:How to stack 6 specific columns in 2 columns with melt or gather function?如何使用熔化或聚集功能将 6 个特定列堆叠在 2 列中?
【发布时间】:2020-08-19 12:39:39
【问题描述】:

这是我的问题的一个例子:

我想离开

A   B   C   D   E   F   G   H
x1  x2  x3  x4  x5  x6  x7  x8
y1  y2  y3  y4  y5  y6  y7  y8
z1  z2  z3  z4  z5  z6  z7  z8

A   B   CDE FGH  
x1  x2  x3  x6  
x1  x2  x4  x7  
x1  x2  x5  x8  
y1  y2  y3  y7  
y1  y2  y4  y6  
y1  y2  y5  y8  

我只能用这段代码将 3 列堆叠成一列

NewData= melt(setDT(Data),measure = list(c(6,7,8)), value.name = "FGH ")

【问题讨论】:

    标签: r data.table reshape2 melt


    【解决方案1】:

    我们可以使用patterns

    library(data.table)
    melt(setDT(Data), measure = patterns("^[CDE]", "^[FGH]"), 
            value.name = c("CDE", "FGH"))[, variable := NULL][]
    

    或者unite的另一个选项

    library(dplyr)
    library(tidyr)
    Data %>% 
        unite(CDE, C, D, E) %>%
        unite(FGH, F, G, H) %>% 
        separate_rows(CDE, FGH)
    

    数据

    Data <- structure(list(A = c("x1", "y1", "z1"), B = c("x2", "y2", "z2"
    ), C = c("x3", "y3", "z3"), D = c("x4", "y4", "z4"), E = c("x5", 
    "y5", "z5"), F = c("x6", "y6", "z6"), G = c("x7", "y7", "z7"), 
        H = c("x8", "y8", "z8")), class = "data.frame", row.names = c(NA, 
    -3L))
    

    【讨论】:

      【解决方案2】:

      我们可以获取长格式的数据,为c('C', 'D', 'E') 和其他值创建单独的值,并获取宽格式的数据。

      library(dplyr)
      library(tidyr)
      
      df %>%
        pivot_longer(cols = -(A:B)) %>%
        mutate(name = ifelse(name %in% c('C', 'D', 'E'), 'CDE', 'FGH')) %>%
        group_by(name) %>%
        mutate(row = row_number()) %>%
        pivot_wider() %>%
        select(-row)
      
      
      # A tibble: 9 x 4
      #  A     B     CDE   FGH  
      #  <chr> <chr> <chr> <chr>
      #1 x1    x2    x3    x6   
      #2 x1    x2    x4    x7   
      #3 x1    x2    x5    x8   
      #4 y1    y2    y3    y6   
      #5 y1    y2    y4    y7   
      #6 y1    y2    y5    y8   
      #7 z1    z2    z3    z6   
      #8 z1    z2    z4    z7   
      #9 z1    z2    z5    z8   
      

      数据

      df <- structure(list(A = c("x1", "y1", "z1"), B = c("x2", "y2", "z2"
      ), C = c("x3", "y3", "z3"), D = c("x4", "y4", "z4"), E = c("x5", 
      "y5", "z5"), F = c("x6", "y6", "z6"), G = c("x7", "y7", "z7"), 
      H = c("x8", "y8", "z8")), class = "data.frame", row.names = c(NA, -3L))
      

      【讨论】:

        猜你喜欢
        • 2020-02-06
        • 2017-05-04
        • 2023-03-13
        • 2014-07-11
        • 2020-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-26
        相关资源
        最近更新 更多