从宽到长,成对组合列但保留 ID 列 - R

Wide to long, combining columns in pairs but keeping ID column - R

我有以下类型的数据框

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.

老实说,我不确定如何处理这个问题,所以没有我尝试过的例子。

如果 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))