Eu tenho um conjunto de dados como este:
df1 <- data.frame(
col1 = c(1, 2, 3),
col2 = c(4, 5, 6),
col3 = c(2, 8, 9),
col4 = c(5, 11, 12),
col5 = c(13, 14, 15),
col6 = c(16, 17, 18),
col7 = c(19, 20, 21),
col8 = c(22, 23, 24)
)
e um segundo que tem uma 'chave' de correspondências que estou procurando no df1:
df2 <- data.frame(
colA = c(1, 2, 3),
colB = c(4, 5, 6),
value = c(100, 200, 300)
)
o que estou tentando fazer é encontrar cada correspondência de coluna em pares da esquerda para a direita e criar uma nova coluna contendo o valor de df2 toda vez que houver uma correspondência, para que fique assim:
df3 <- data.frame(
col1 = c(1, 2, 3),
col2 = c(4, 5, 6),
col3 = c(2, 8, 9),
col4 = c(5, 11, 12),
col5 = c(13, 14, 15),
col6 = c(16, 17, 18),
col7 = c(19, 20, 21),
col8 = c(22, 23, 24),
match1 = c(100, 200, 300),
match2 = c(200, NA, NA)
)
Eu tentei esse tipo de abordagem:
df_match <- inner_join(df1, df2, by = c("col1" = "colA", "col2" = "colB"))
df1$matched_value <- df_match$value[match(paste(df1$col1, df1$col2), paste(df_match$col1, df_match$col2))]
mas ele retorna apenas uma correspondência entre as linhas. O outro problema é que estou executando isso por muitas iterações que têm números variados de colunas em df1. Estou pensando que preciso de algo do tipo entre as linhas começa com 'col', mas estou bem travado.
Você pode tentar o seguinte usando
Reduce
:Que retorna:
Seria então fácil omitir as colunas "match" que são todas NA, se desejado. Por exemplo.
Tentar
combn
+match
+colSums
e você obterá
na Base R:
no Tidyverse:
Poderíamos
match
entrar .rle
outer
Outra
tidyverse
opção poderia ser (assumindo colunas sobrepostas como 1-2, 2-3, 3-4):