2017-09-28 3 views
1

Je suis en train de fusionner des lignes tout recoder les valeurs dans le cadre de données suivantes:R - La combinaison de lignes et de renommer les valeurs

 Days Object Frequency 
1 1  Fruit 20 
2 2  Fruit 21 
3 3  Fruit 41 
4 4  Fruit 12 
5 5  Fruit 1 
6 6  Fruit 9 
8 8  Fruit 1 
9 9  Fruit 14 

Essentiellement, je voudrais regrouper les jours en variables comme celui-ci:

Days Object Frequency 
1 1-2  Fruit  41 
2 3-4  Fruit  43 
3 5+  Fruit  25 

Y at-il un moyen de fusionner lors de la création de nouvelles valeurs pour la colonne Jours?

Toutes mes excuses si cela est une question idiote

Répondre

3

Dans la base R, vous pouvez combiner cut et aggregate. Ici, cut génère les groupes de jours et fournit des étiquettes à ces groupes. Ceci est alimenté dans une liste avec Object à aggregate pour effectuer le regroupement complet. aggregate prend Frequency comme premier argument et s'applique sum.

aggregate(dat$Frequency, list(Days=cut(dat$Days, c(-Inf, 2, 4, Inf), 
             labels=c("1-2", "2-4", "5+")), 
           object=dat$Object), 
      sum) 

ce retour

Days object x 
1 1-2 Fruit 41 
2 2-4 Fruit 53 
3 5+ Fruit 25 

pour renommer la variable x, vous pouvez envelopper cela dans setNames, ou tout simplement utiliser names<- dans une deuxième ligne.

Le data.table équivalent à c'est

library(data.table) 
setDT(dat)[, sum(Frequency), 
      by=list(Days=cut(dat$Days, c(-Inf, 2, 4, Inf), labels=c("1-2", "2-4", "5+")), 
        object=dat$Object)] 
    Days object V1 
1: 1-2 Fruit 41 
2: 2-4 Fruit 53 
3: 5+ Fruit 25 
3

Vous pouvez créer la variable de groupe group_by dynamiquement, et ne résumé (en supposant que vous souhaitez groupe par Object ainsi):

df %>% 
    group_by(Days = if_else(Days %in% c(1,2), "1-2", if_else(Days %in% c(3,4), "3-4", "5+")), 
      Object) %>% 
    summarise(Frequency = sum(Frequency)) 

# A tibble: 3 x 3 
# Groups: Days [?] 
# Days Object Frequency 
# <chr> <fctr>  <int> 
#1 1-2 Fruit  41 
#2 3-4 Fruit  53 
#3 5+ Fruit  25