web-dev-qa-db-fra.com

Compter conditionnellement en dplyr

J'ai des données de commande de membre que je voudrais regrouper par semaine de commande.

Voici à quoi ressemblent les données:

memberorders=data.frame(MemID=c('A','A','B','B','B','C','C','D'),
             week = c(1,2,1,4,5,1,4,1),
             value = c(10,20,10,10,2,5,30,3))

J'utilise dplyr pour grouper par "MemID" et résumer "valeur" pour "semaine" <= 2 et <= 4 (pour voir combien chaque membre a commandé pendant les semaines 1-2 et 1-4. Le code que j'ai actuellement est :

MemberLTV <- memberorders %>%
group_by(MemID) %>%
summarize(
sum2 = sum(value[week<=2]),
sum4 = sum(value[week<=4]))

J'essaie maintenant d'ajouter deux champs supplémentaires dans le résumé, count2 et count4, qui compteraient le nombre d'instances de chaque condition (semaine <= 2 et semaine <= 4).

La sortie souhaitée est:

output  = data.frame(MemID = c('A','B','C','D'),
                 sum2 = c(30,10,5,3),
                 sum4 = c(30,20,35,3),
                 count2 = c(2,1,1,1),
                 count4 = c(2,2,2,1))

Je suppose que c'est juste un petit ajustement de la fonction de somme, mais j'ai du mal à le comprendre.

34
SFuj

Essayer

 library(dplyr)
 memberorders %>% 
        group_by(MemID) %>% 
        summarise(sum2= sum(value[week<=2]), sum4= sum(value[week <=4]), 
                  count2=sum(week<=2), count4= sum(week<=4))
48
akrun

En utilisant les deux idées de prévisualisation et en les maintenant cohérentes:

MemberLTV_2 <- memberorders %>%

group_by(MemID) %>%
summarize(

    count2 = length(value[week<=2]),
    count4 = length(value[week<=4]),
    sum2 = sum(value[week<=2]),
    sum4 = sum(value[week<=4])

    )
9
Camilo Abboud

En utilisant le package plyr on pourrait faire

ddply(memberorders,.(MemID),
                    summarise, 
                    val1 = sum(value[week<=2]), 
                    val2 = sum(value[week<=4]),
                    val3 = length(value[week<=2]),
                    val4 = length(value[week<=4]))

  MemID val1 val2 val3 val4
1     A   30   30    2    2
2     B   10   20    1    2
3     C    5   35    1    2
4     D    3    3    1    1
3
Alexey Ferapontov