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

La fonction GCP Cloud pour écrire des données dans BigQuery s'exécute avec succès, mais les données n'apparaissent pas dans la table BigQuery

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

Le shell POSIX (sh) redirige stderr vers stdout et capture stderr et stdout dans des variables