1

for example I have a dataset that looks like this

structure(list(ID = c(1, 2, 3, 4, 5), COL1 = c("A", "B", "C", 
"D", "E"), COL2 = c("F", "G", "H", "I", "J"), Paired = c(2, 3, 
1, 2, 1)), row.names = c(NA, -5L), class = c("tbl_df", "tbl", 
"data.frame"))

 ID COL1  COL2  Paired

  1 A     F          2
  2 B     G          3
  3 C     H          1
  4 D     I          2
  5 E     J          1

I would like to create a dataset that looks like this. Note the number in the paired column

Col  Col2
 A      F
 A      F
 F      A
 F      A
 B      G
 B      G
 B      G
 G      B
 G      B
 G      B
 C      H
 H      C
 D      I
 D      I
 I      D
 I      D
 E      J 
 J      E

Note that A F is paired up two times. I want it basically to show in long the two times A and F paired in both combination scenario so 2 pairs is AF, AF, FA, FA.

user35131
  • 1,105
  • 6
  • 18
  • 1
    Basically you can just repeat the rows using `uncount()`. If you need the columns reversed, you can swap them and just combine: `bind_rows(dd ,dd %>% mutate(tmp=COL1, COL1=COL2, COL2=tmp, tmp=NULL)) %>% arrange(ID) %>% uncount(Paired)` – MrFlick Jul 14 '21 at 19:04

1 Answers1

2

We can use

library(dplyr)
library(tidyr)
df1 %>% 
   uncount(Paired) -> tmp
tmp %>%
    rename(COL1= COL2, COL2 = COL1) %>% 
    bind_rows(tmp) %>%
    select(-ID)

-output

 A tibble: 18 x 2
   COL2  COL1 
   <chr> <chr>
 1 A     F    
 2 A     F    
 3 B     G    
 4 B     G    
 5 B     G    
 6 C     H    
 7 D     I    
 8 D     I    
 9 E     J    
10 F     A    
11 F     A    
12 G     B    
13 G     B    
14 G     B    
15 H     C    
16 I     D    
17 I     D    
18 J     E    
akrun
  • 874,273
  • 37
  • 540
  • 662