根据现有行的成对组合在 R 中创建行

Create rows in R, based on pair combinations of existing rows

我有

col_a col_c
1 A 01001
2 B 01002
3 C 01003
4 D 01004
5 E 01005
6 F 01006

我要

col_a col_b col_c
1 A A 01001
2 A B 01002
3 A C 01003
4 A D 01004
5 A E 01005
6 A F 01006
7 B A 01001
8 B B 01002
9 B C 01003
10 B D 01004
11 B E 01005
.. .. ..
24 F E 01005
25 F F 01006

我觉得这很简单,但是 4:30 我的大脑不再工作了,请帮忙。

我试过了

#Set up a fake key to join on (just a constant)
df <- df %>% mutate(k = 1) 

 #Perform the join, remove the key
main_df %>% 
  full_join(df, by = "k") %>%
 select(-k)

我也试过了

df <-
merge(
  x = df,
  y = df[, c("col_a",
             "col_c")],
     by.x = "a",
     by.y = "a",
     all = TRUE
   )

  df <-
   merge(
     x = df[, c("col_a",
                     "col_c")],
     y = main_df,
     by.x = "col_a",
     by.y = "col_a",
     all.x = TRUE
   )

我已经尝试了上述解决方案的许多组合,而不仅仅是这里列出的那些。没有用。

试试下面的代码

out <- merge(data.frame(col_b = df$col_a), df, all = TRUE)[c("col_a", "col_b", "col_c")]

out <- with(
  df,
  cbind(
    setNames(rev(expand.grid(col_a, col_a)), c("col_a","col_b")),
    col_c = rep(col_c, by = nrow(df))
  )
)

你会看到

> out
   col_a col_b col_c
1      A     A  1001
2      A     B  1002
3      A     C  1003
4      A     D  1004
5      A     E  1005
6      A     F  1006
7      B     A  1001
8      B     B  1002
9      B     C  1003
10     B     D  1004
11     B     E  1005
12     B     F  1006
13     C     A  1001
14     C     B  1002
15     C     C  1003
16     C     D  1004
17     C     E  1005
18     C     F  1006
19     D     A  1001
20     D     B  1002
21     D     C  1003
22     D     D  1004
23     D     E  1005
24     D     F  1006
25     E     A  1001
26     E     B  1002
27     E     C  1003
28     E     D  1004
29     E     E  1005
30     E     F  1006
31     F     A  1001
32     F     B  1002
33     F     C  1003
34     F     D  1004
35     F     E  1005
36     F     F  1006