【问题标题】:Wide to long, combining columns in pairs but keeping ID column - R从宽到长,成对组合列,但保留 ID 列 - R
【发布时间】:2020-07-23 01:18:33
【问题描述】:

我有以下类型的数据框

ID case1 case2 case3 case4
1  A     B     C     D
2  B     A
3  E     F
4  G     C     A
5  T

我需要将其格式更改为长形,如下所示:

ID col1 col2
1  A    B
1  A    C
1  A    D
1  B    C
1  B    D
1  C    D
2  B    A
3  E    F
4  G    C
4  G    A
4  C    A
5  T

如您所见,我需要维护 ID 并忽略空列。有一些像T 这样的情况需要保留在数据集中,但没有col2

老实说,我不知道如何解决这个问题,所以没有我尝试过的例子。

【问题讨论】:

    标签: r dataframe reshape data-wrangling


    【解决方案1】:

    如果ID 中的行数大于1,您可以获取长格式数据并为每个ID 创建所有值组合。

    library(dplyr)
    library(tidyr)
    
    df %>%
      pivot_longer(cols = -ID, values_drop_na = TRUE) %>%
      group_by(ID) %>%
      summarise(value = if(n() > 1) list(setNames(as.data.frame(t(combn(value, 2))), 
                                   c('col1', 'col2'))) 
                     else list(data.frame(col1 = value[1], col2 = NA_character_))) %>%
      unnest(value)
    
    
    # A tibble: 12 x 3
    #      ID col1  col2 
    #   <int> <chr> <chr>
    # 1     1 A     B    
    # 2     1 A     C    
    # 3     1 A     D    
    # 4     1 B     C    
    # 5     1 B     D    
    # 6     1 C     D    
    # 7     2 B     A    
    # 8     3 E     F    
    # 9     4 G     C    
    #10     4 G     A    
    #11     4 C     A    
    #12     5 T     NA   
    

    数据

    df <- structure(list(ID = 1:5, case1 = c("A", "B", "E", "G", "T"), 
    case2 = c("B", "A", "F", "C", NA), case3 = c("C", NA, NA, 
    "A", NA), case4 = c("D", NA, NA, NA, NA)), 
    class = "data.frame", row.names = c(NA, -5L))
    

    【讨论】:

      猜你喜欢
      • 2021-12-21
      • 2019-11-22
      • 1970-01-01
      • 2018-04-09
      • 1970-01-01
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多