【问题标题】:Wider to longer transformation in RR中从更宽到更长的转换
【发布时间】:2021-07-26 14:46:09
【问题描述】:

考虑以下形状较宽的数据,

ID   OPEN   ANSWER   CLOSE   OPEN_BY   CLOSE_BY
1     13     15       17     ABC        XXYZ

我想使用tidyr::pivot_longer 转换为更长的形状,如下所示。

ID   date     user
1     13       ABC
1     15       NA
1     17       XYZ

提前致谢。

可重现的样本数据

structure(list(ID = 1L, OPEN = 13L, ANSWER = 15L, CLOSE = 17L, 
    OPEN_BY = "ABC", CLOSE_BY = "XXYZ"), class = "data.frame", row.names = c(NA, 
-1L))

【问题讨论】:

    标签: r reshape tidyr


    【解决方案1】:

    在继续之前,您可能需要对名称进行一些转换

    一个演示示例

    library(tidyverse)
    
    df <-  read.table(header = T, text = 'ID   OPEN   ANSWER   CLOSE   OPEN_BY   CLOSE_BY
    1     13     15       17     ABC        XXYZ')
    names(df)[grep('_', names(df), invert = TRUE)] <- paste0(names(df)[grep('_', names(df), invert = TRUE)], '_x')
    
    df %>%
      pivot_longer(cols = !ID_x, names_pattern = '([^_]*)_(.*)', names_to = c('a','.value')) %>%
      select(-a)
    #> # A tibble: 3 x 3
    #>    ID_x     x BY   
    #>   <int> <int> <chr>
    #> 1     1    13 ABC  
    #> 2     1    15 <NA> 
    #> 3     1    17 XXYZ
    

    或者可能是这个,(我的friend 建议这个)在一个管道中

    library(tidyverse)
    
    df <-  read.table(header = T, text = 'ID   OPEN   ANSWER   CLOSE   OPEN_BY   CLOSE_BY
    1     13     15       17     ABC        XXYZ')
    
    df %>%
      rename_with(~ paste0(., '_date'), !(ID | ends_with("BY"))) %>%
      pivot_longer(!ID, names_to = c("n", ".value"),
                   names_pattern = "(.*)_(.*)") %>%
      select(-n)
    
    #> # A tibble: 3 x 3
    #>      ID  date BY   
    #>   <int> <int> <chr>
    #> 1     1    13 ABC  
    #> 2     1    15 <NA> 
    #> 3     1    17 XXYZ
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      相关资源
      最近更新 更多