3 votes

R : compter les combinaisons distinctes trouvées dans un data frame où les colonnes sont interchangeables

Je ne suis pas sûr de comment appeler ce problème. Disons que je compte les combinaisons distinctes de 2 colonnes, mais je veux une distinction à travers l'ordre des deux colonnes. Voilà ce que je veux dire :

df = data.frame(fruit1 = c("pomme", "orange", "orange", "banane", "kiwi"),
                fruit2 = c("orange", "pomme", "banane", "orange", "pomme"),
                stringsAsFactors = FALSE)

# Ce que je veux : le nombre total de combinaisons de fruits, peu importe 
# lequel vient en premier et lequel en second.
# Par exemple, 2 pomme-orange, 2 banane-orange, 1 kiwi-pomme

# Ce qui ne fonctionne pas :

table(df$fruit1, df$fruit2) 

# Ce qui fonctionne :
library(dplyr)
df %>% group_by(fruit1, fruit2) %>% 
  transmute(fruitA = sort(c(fruit1, fruit2))[1],
            fruitB = sort(c(fruit1, fruit2))[2]) %>%
  group_by(fruitA, fruitB) %>%
  summarise(combinations = n())

J'ai trouvé un moyen de faire fonctionner cela, comme vous pouvez le voir, mais y a-t-il un nom pour ce problème général ? C'est un peu un problème de combinatoire mais de dénombrement, pas de génération de combinaisons. Et que se passerait-il si j'avais trois ou quatre colonnes de type similaire ? La méthode ci-dessus est peu généralisable. Les approches de la Tidyverse sont les bienvenues !

4voto

W-B Points 94428

En utilisant apply et sort ordonner votre dataframe puis nous utilisons simplement group_by count

data.frame(t(apply(df,1,sort)))%>%group_by_all(.)%>%count()
# Un tibble : 3 x 3
# Groupes :   X1, X2 [3]
      X1     X2     n

1  pomme   kiwi     1
2  pomme orange     2
3 banane orange     2

0voto

akrun Points 148302

Voici une option utilisant pmap avec count

library(tidyverse)
library(rlang)
pmap_df(df, ~ sort(c(...)) %>%
                 as.list %>%
                 as_tibble %>%
                 set_names(names(df))) %>% 
    count(!!! rlang::syms(names(.)))
# A tibble: 3 x 3
#  fruit1 fruit2     n
#       
#1 apple  kiwi       1
#2 apple  orange     2
#3 banana orange     2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X