Group_by unique compte sur plusieurs colonnes

0

La question

J'ai une table avec les informations sur les magasins et les fruits (pommes et oranges). Chaque magasin dispose d'un inventaire où ces fruits sont enregistrées par leur Id.

  • Les pommes et les oranges peuvent être de différents types, par exemple, pink lady, royal gala, la pomme d'eve, la pomme de jazz etc. Quand ils sont de différents types, ils sont stockés avec des Identifiants différents.
  • Mais quand deux pommes sont du même type, ils ont le même ID.

Je suis intéressé à compter, pour chaque atelier, combien de différents types de pommes et de nombreux types différents d'oranges sont là.

Mon entrée est:

Shop     Apple_id   Orange_id
Coles    12         201
Woolies  20         51
Walmart  13         16
Woolies  20         52
Coles    14         202
Target   19         81
M&S      75         99
Coles    16         203
M&S      71         99
Dunnes   56         101
M&S      72         91

Ma sortie attendue est:

Shop    Apples  Oranges
Coles   3       3
Dunnes  1       1
M&S     3       2
Target  1       1
Walmart 1       1
Woolies 1       2

Je peux exécuter le code un par un pour chaque fruit à l'aide de la dplyr() package:

# Extract information on Apples only
library(dplyr)

apples_by_shop = raw %>%
  group_by(shop) %>%
  distinct(Apple_id) %>%
  count()

De même, je peux écrire du code pour extraire de l'information pour les oranges seulement:

# Extract information on Oranges only
oranges_by_shop = raw %>%
  group_by(shop) %>%
  distinct(Orange_id) %>%
  count()

Ma question est, puis-je les fusionner les deux ci-dessus dans une seule ligne de code par exemple, par le biais de la résumer de la fonction?

count group-by multiple-columns r
2021-11-24 00:33:23
2

La meilleure réponse

2

Vous pouvez essayer

library(dplyr)

raw %>%
  group_by(Shop) %>%
  summarise(Apples = length(unique(Apple_id)),
            Oranges = length(unique(Orange_id)))

  Shop    Apples Oranges
  <chr>    <int>   <int>
1 Coles        3       3
2 Dunnes       1       1
3 M&S          3       2
4 Target       1       1
5 Walmart      1       1
6 Woolies      1       2

df %>%
  group_by(Shop) %>%
  summarise(Apples = n_distinct(Apple_id),
            Oranges = n_distinct(Orange_id))
2021-11-24 00:40:45

Merci, @Park. C'est tellement facile. J'avais essayé distinct() au lieu de unique() et count() au lieu de length(). Apprécier la réponse rapide. Accepter la réponse, car il fonctionne sur l'original de mes données.
Sandy

@Sandy Similaire à distinct, vous pouvez utiliser n_distinct et il va donner un bon résultat. - Je ajouter le code.
Park

La deuxième option est encore mieux, il y a tellement de choses à apprendre :)
Sandy
1

Vous pouvez le faire en une ligne dans la base de R.

aggregate(. ~ Shop, dat, function(x) length(unique(x)))
#      Shop Apple_id Orange_id
# 1   Coles        3         3
# 2  Dunnes        1         1
# 3     M&S        3         2
# 4  Target        1         1
# 5 Walmart        1         1
# 6 Woolies        1         2

Données:

dat <- structure(list(Shop = c("Coles", "Woolies", "Walmart", "Woolies", 
"Coles", "Target", "M&S", "Coles", "M&S", "Dunnes", "M&S"), Apple_id = c(12L, 
20L, 13L, 20L, 14L, 19L, 75L, 16L, 71L, 56L, 72L), Orange_id = c(201L, 
51L, 16L, 52L, 202L, 81L, 99L, 203L, 99L, 101L, 91L)), class = "data.frame", row.names = c(NA, 
-11L))
2021-11-24 00:35:25

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................