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 outdata.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

Posts les plus consultés de ce blog

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"