fusion floue d'une colonne avec une liste
Les données sont les suivantes :
library(fuzzyjoin)
nr <- c(1,2)
col2 <- c("b","a")
dat <- cbind.data.frame(
nr, col2
)
thelist <- list(
aa=c(1,2,3),
bb=c(1,2,3)
)
Je voudrais ce qui suit:
stringdist_left_join(dat, thelist, by = "col2", method = "lcs", max_dist = 1)
Mais cela (sans surprise) donne une erreur :
Error in `group_by_prepare()`:
! Must group by variables found in `.data`.
* Column `col` is not found.
Run `rlang::last_error()` to see where the error occurred.
Quelle serait la meilleure façon de faire cela?
Sortie désirée:
nr col2 thelist list_col
1 b bb c(1,2,3)
2 a aa c(1,2,3)
Solution du problème
C'est un peu un hack. Je ne sais pas s'il existe une solution plus élégante.
Créez un data.frame de la liste transposée et pivotez-le dans un data.frame avec tous les noms de la liste dans une colonne nommée "col2". Utilisez ensuite la jointure floue pour fusionner les données. Avec le out
data.frame résultant, vous pouvez supprimer les colonnes dont vous n'avez pas besoin.
library(fuzzyjoin)
library(tidyr)
dat <- data.frame(
nr = c(1,2), col2 = c("b","a")
)
thelist <- list(
aa=c(1,2,3),
bb=c(1,2,3,4)
)
# create data.frame with list info
a <- pivot_longer(data.frame(t(thelist)), cols = everything(), names_to = "col2")
a
# A tibble: 2 x 2
col2 value
<chr> <named list>
1 aa <dbl [3]>
2 bb <dbl [4]>
# merge data
out <- stringdist_left_join(dat, a, by = "col2", method = "lcs", max_dist = 1)
out
nr col2.x col2.y value
1 1 b bb 1, 2, 3, 4
2 2 a aa 1, 2, 3
Commentaires
Enregistrer un commentaire