2017-09-29 2 views
0

Je voulais obtenir toutes les combinaisons uniques par paires d'une colonne de chaîne unique d'une trame de données en utilisant le tidyverse (idéalement).tidyr - façon unique d'obtenir des combinaisons (en utilisant tidyverse seulement)

Voici un exemple fictif:

library(tidyverse) 

a <- letters[1:3] %>% 
     tibble::as_tibble() 
a 
#> # A tibble: 3 x 1 
#> value 
#> <chr> 
#> 1  a 
#> 2  b 
#> 3  c 

tidyr::crossing(a, a) %>% 
    magrittr::set_colnames(c("words1", "words2")) 
#> # A tibble: 9 x 2 
#> words1 words2 
#> <chr> <chr> 
#> 1  a  a 
#> 2  a  b 
#> 3  a  c 
#> 4  b  a 
#> 5  b  b 
#> 6  b  c 
#> 7  c  a 
#> 8  c  b 
#> 9  c  c 

est-il un moyen de supprimer les combinaisons en double « » ici. C'est que la sortie soit ce qui suit dans cet exemple:

# A tibble: 9 x 2 
#> words1 words2 
#> <chr> <chr> 
#> 1  a  b 
#> 2  a  c 
#> 3  b  c 

J'espérais qu'il y aurait une belle purrr::map ou filter approche de tuyau en pour compléter ce qui précède.

EDIT: Il y a des questions similaires à celle-ci. ici, marqué par @Sotos. Ici, je suis spécifiquement à la recherche de moyens tidyverse (purrr, dplyr) pour compléter le pipeline que j'ai configuré. Les autres réponses utilisent divers autres paquets que je ne veux pas inclure en tant que dépendances.

+0

@Sotos - J'ai déjà lu cette question. Je pose spécifiquement cette question pour utiliser les paquets tidyverse et en particulier les solutions purrr :: map. Veuillez supprimer le drapeau de duplication – user4687531

Répondre

0

Quelque chose comme ça?

tidyr::crossing(a, a) %>% 
    magrittr::set_colnames(c("words1", "words2")) %>% 
    rowwise() %>% 
    mutate(words1 = sort(c(words1, words2))[1],  # sort order of words for each row 
     words2 = sort(c(words1, words2))[2]) %>% 
    filter(words1 != words2) %>%      # remove word combinations with itself 
    unique()           # remove duplicates 

# A tibble: 3 x 2 
    words1 words2 
    <chr> <chr> 
1  a  b 
2  a  c 
3  b  c