web-dev-qa-db-fra.com

dplyr: place les occurrences de comptage dans une nouvelle variable

Voudrait mettre la main sur le code dplyr, mais ne peut pas le comprendre. Vous avez vu un problème similaire décrit ici pour de nombreuses variables ( résumant les décomptes d'un facteur avec dplyr et Placer les décomptes en ligne des occurrences de valeur dans de nouvelles variables, comment faire cela dans R avec dplyr? ), mais ma tâche est un peu plus petite.
Étant donné une trame de données, comment puis-je compter la fréquence d'une variable et la placer dans une nouvelle variable.

set.seed(9)
df <- data.frame(
    group=c(rep(1,5), rep(2,5)),
    var1=round(runif(10,1,3),0))

Ensuite nous avons:

>df
   group var1
1      1    1
2      1    1
3      1    1
4      1    1
5      1    2
6      2    1
7      2    2
8      2    2
9      2    2
10     2    3

Souhaiterait une troisième colonne indiquant par groupe (group) combien de fois var1 se produit, dans cet exemple, ce serait: count = (4,4,4,4,1,1,3,3,3,1). J'ai essayé - sans succès - des choses comme:

df %>%  group_by(group) %>% rowwise() %>% do(count = nrow(.$var1))

Les explications sont très appréciées!

29
user3375672

Il vous suffit de regrouper vos données par les deux colonnes, "groupe" et "var1":

df %>% group_by(group, var1) %>% mutate(count = n())
#Source: local data frame [10 x 3]
#Groups: group, var1
#
#   group var1 count
#1      1    1     4
#2      1    1     4
#3      1    1     4
#4      1    1     4
#5      1    2     1
#6      2    1     1
#7      2    2     3
#8      2    2     3
#9      2    2     3
#10     2    3     1

Modifier après commentaire

Voici un exemple de la façon dont vous NE DEVRIEZ PAS LE FAIRE:

df %>% group_by(group, var1) %>% do(data.frame(., count = length(.$group)))

L'implémentation de dplyr avec n() est à coup sûr beaucoup plus rapide, plus propre et plus courte et doit toujours être préférée aux implémentations comme ci-dessus.

43
docendo discimus

C'est peut-être une nouvelle fonctionnalité, mais cela peut être fait avec une seule commande dplyr:

df %>% add_count(group, var1)
   group  var1     n
 1     1     1     4
 2     1     1     4
 3     1     1     4
 4     1     1     4
 5     1     2     1
 6     2     1     1
 7     2     2     3
 8     2     2     3
 9     2     2     3
10     2     3     1
14
meboyhe

Nous pouvons utiliser probablement une autre fonction pratique tally de dplyr

df %>% group_by(group, var1) %>% tally()
# Source: local data frame [5 x 3]
# Groups: group
# 
#   group var1 n
# 1     1    1 4
# 2     1    2 1
# 3     2    1 1
# 4     2    2 3
# 5     2    3 1
10
KFB

Deux alternatives:

1: avec la base R:

# option 1:
df$count <- ave(df$var1, df$var1, df$group, FUN = length)
# option 2:
df <- transform(df, count = ave(var1, var1, group, FUN = length))

qui donne:

> df
   group var1 count
1      1    1     4
2      1    1     4
3      1    1     4
4      1    1     4
5      1    2     1
6      2    1     1
7      2    2     3
8      2    2     3
9      2    2     3
10     2    3     1

2: avec data.table :

library(data.table)
setDT(df)[, count:=.N, by = .(group, var1)]

ce qui donne le même résultat:

> df
    group var1 count
 1:     1    1     4
 2:     1    1     4
 3:     1    1     4
 4:     1    1     4
 5:     1    2     1
 6:     2    1     1
 7:     2    2     3
 8:     2    2     3
 9:     2    2     3
10:     2    3     1

Si vous souhaitez résumer, vous pouvez utiliser:

# with base R:
aggregate(id ~ group + var1, transform(df, id = 1), length)

# with 'dplyr':
count(df, group, var1)

# with 'data.table':
setDT(df)[, .N, by = .(group, var1)]
6
Jaap