4 votes

Compter les éléments uniques d'une liste

En supposant que j'ai une table de données dt.recipes qui consiste en des listes avec divers éléments, par exemple :

recipe_id     ingredients
1             apple, banana, cucumber, water
2             apple, meat, water
3             water

Comment puis-je créer un tableau, comptant la quantité de unique les éléments présents dans dt.recipes$ingredients ? En d'autres termes, je cherche un résultat similaire à celui-ci :

ingredient    count
water         3
apple         2
banana        1
cucumber      1
meat          1

Tout conseil serait grandement apprécié, merci d'avance !

5voto

Allan Cameron Points 56117

Vous pouvez le faire :

 as.data.frame(table(unlist(strsplit(df$ingredients, ", "))))
#>       Var1 Freq
#> 1    apple    2
#> 2   banana    1
#> 3 cucumber    1
#> 4     meat    1
#> 5    water    3

Données

df <- structure(list(recipe_id = 1:3, 
               ingredients = c("apple, banana, cucumber, water", 
                               "apple, meat, water", 
                               "water")), 
          class = "data.frame", row.names = c(NA, -3L))

df
#>   recipe_id                    ingredients
#> 1         1 apple, banana, cucumber, water
#> 2         2             apple, meat, water
#> 3         3                          water

Créé le 2022-03-07 par le paquet reprex (v2.0.1)

3voto

Maël Points 644

Avec les fonctions de tidyverse :

library(tidyverse)
df %>% 
  separate_rows(ingredients) %>% 
  count(ingredients, name = "count") %>% 
  arrange(desc(count))

# A tibble: 5 x 2
#  ingredients count
#  <chr>       <int>
#1 water           3
#2 apple           2
#3 banana          1
#4 cucumber        1
#5 meat            1

3voto

markus Points 18578

A data.table pourrait être

library(data.table)
dt[, .(table(unlist(ingredients)))]
#         V1 N
#1:    apple 2
#2:   banana 1
#3: cucumber 1
#4:     meat 1
#5:    water 3

données

dt <- data.table(
  "recipe_id" = 1:3,
  "ingredients" = list(
    c("apple", "banana", "cucumber", "water"),
    c("apple", "meat", "water"),
    c("water")
  )
)

1voto

ThomasIsCoding Points 54213

Une option de base R avec scan + table + as.data.frame

> with(df, as.data.frame(table(trimws(scan(text = ingredients, what = "", sep = ",", quiet = TRUE)))))
      Var1 Freq
1    apple    2
2   banana    1
3 cucumber    1
4     meat    1
5    water    3

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