Estou tentando obter todas as combinações de linhas de uma coluna para ela mesma, mantendo os valores de uma segunda coluna.
library(dplyr)
library(tidyr)
dt0 <-
data.frame(
row = letters[1:10],
n1 = c(2, 2, 1, 3, 1, 5, 1, 3, 2, 2)
)
dt0 |>
expand(
row1 = row,
row2 = row
) |>
filter(row1 < row2) |>
left_join(
dt0 |>
rename(n1.x = n1),
by = join_by(row1 == row)
) |>
left_join(
dt0 |>
rename(n1.y = n1),
by = join_by(row2 == row)
)
o resultado esperado é:
# A tibble: 45 × 4
row1 row2 n1.x n1.y
<chr> <chr> <dbl> <dbl>
1 a b 2 2
2 a c 2 1
3 a d 2 3
4 a e 2 1
5 a f 2 5
6 a g 2 1
7 a h 2 3
8 a i 2 2
9 a j 2 2
10 b c 2 1
# ℹ 35 more rows
# ℹ Use `print(n = ...)` to see more rows
Mas não sei como generalizar isso para gerar todas as combinações dos elementos das linhas do data.frame tomadas m
de uma vez, então minha pergunta é: Como posso generalizar esse padrão para qualquer número de linhas em expand(...)
? Por exemplo, com três
dt0 |>
expand(
row1 = row,
row2 = row,
row3 = row
) |>
filter(row1 < row2) |>
filter(row2 < row3) |>
left_join(
dt0 |>
rename(n1.x = n1),
by = join_by(row1 == row)
) |>
left_join(
dt0 |>
rename(n1.y = n1),
by = join_by(row2 == row)
) |>
left_join(
dt0 |>
rename(n1.z = n1),
by = join_by(row3 == row)
)
# A tibble: 120 × 6
row1 row2 row3 n1.x n1.y n1.z
<chr> <chr> <chr> <dbl> <dbl> <dbl>
1 a b c 2 2 1
2 a b d 2 2 3
3 a b e 2 2 1
4 a b f 2 2 5
5 a b g 2 2 1
6 a b h 2 2 3
7 a b i 2 2 2
8 a b j 2 2 2
9 a c d 2 1 3
10 a c e 2 1 1
# ℹ 110 more rows
# ℹ Use `print(n = ...)` to see more rows
Acho
combn
queexpand
se encaixa melhor no seu propósitoou
tal que
Você pode usar
tidyverse
:Para generalizar: