2017-10-20 3 views
1

J'essaie de travailler sur une trame de données que j'ai, mais j'ai du mal à trouver la dernière date associée à un nom et la somme totale associée à un nom. Mon cadre ressemble à ceciUtilisation de la boucle for pour muter un data.frame dans r

a<- 
Date   Name   Sum 
<date>  <chr>  <dbl> 

23.02.2017 Johnny  6  
24.02.2017 Jane   20   
24.02.2017 Micky Mouse 20   
27.02.2017 Jane   20   
3.03.2017 Johnny  20   
3.03.2017 Ronald  25  

Je voudrais obtenir quelque chose comme ça

b<- 
Latest Date   Name   Frequency  Total Sum 
<date>    <chr>   <dbl>   <dbl> 

3.03.2017   Johnny   2    26 
27.02.2017   Jane    2    40 
24.02.2017   Micky Mouse  1    20  
3.03.2017   Ronald   1    25 

I Started en utilisant la fonction de table, puis en utilisant une boucle, mais je suis un peu Noob.

b <- data.frame(table(a$Name)) 
# after cleaning 
b<- 
Name   Frequency 
<chr>   <int>   

Johnny   2    
Jane    2    
Micky Mouse  1     
Ronald   1 


for (i in (a$Name)) { 
    b <- a %>% 
    mutate(Total Sum = sum(a$Sum[a$Name == i] %>% 
    mutate(Latest Date = max(a$date[a$Name == i])) 
} 

Cela me renvoie une trame de données qui ressemble à ceci

b<- 

Name   Frequency  Total Sum  Latest Date 
<chr>   <int>   <dbl>   <date> 

Johnny   2    40   27.02.2017 
Jane    2    40   27.02.2017 
Micky Mouse  1    40   27.02.2017 
Ronald   1    40   27.02.2017 

Comment puis-je faire en sorte que la somme totale est seulement celle de Johnny, Jane ... et que la date est la dernière date associée à ce nom

+2

'(dplyr); df%>% group_by (Nom)%>% summarize (Total_Sum = somme (Somme), Latest_Date = max (Date)) 'devrait fonctionner. – Axeman

+0

Aussi [voir ici] (https://stackoverflow.com/questions/1660124/how-to-sum-a-variable-by-group). – Axeman

+0

belle. Je vous remercie! –

Répondre

-2

Vous pouvez utiliser group_by et summarise de dplyr R Package.

b <- a %>% 
    group_by(Name) %>% 
    summarise(Total_Sum = sum(Sum)) 

c <- a %>% 
    count(Name) 

df <- left_join(b, c) 
+0

'summarise' supprime le dernier groupe, donc un double' summarise' renverra dans ce cas une ligne ... Sauf qu'il échoue car la colonne 'Date' n'est même plus là. De plus, vous devriez avoir 'sum (Sum)', et il vous manque un pipe. – Axeman

+0

Ouais j'ai essayé de l'utiliser et ça marche bien pour la Somme, mais comme le dit Axeman, double resume retourne une seule ligne si j'utilise max (a $ date), en utilisant juste max (date) donnera une erreur d'objet non trouvé. –

+0

@Axeman vous avez raison. Je modifie le code. Je vous remercie. – patL

0

Cela devrait fonctionner:

df <- read.table(text = "Date   Name   Sum 
        1 23.02.2017 Johnny  6  
        2 24.02.2017 Jane   20   
        3 24.02.2017 Micky_Mouse 20   
        4 27.02.2017 Jane   20   
        5 3.03.2017 Johnny  20   
        6 3.03.2017 Ronald  25") 

df%>%group_by(Name)%>% 
    mutate(Date_Formated = as.Date(Date, format = "%d.%m.%Y"))%>% 
    summarise(totalByName = sum(Sum),firstDate = max(Date_Formated)) 


# A tibble: 4 x 3 
     Name totalByName firstDate 
     <fctr>  <int>  <date> 
1  Jane   40 2017-02-24 
2  Johnny   26 2017-02-23 
3 Micky_Mouse   20 2017-02-24 
4  Ronald   25 2017-03-03 
bibliothèque
+0

OP demande la dernière date, pas la première. (Voir aussi mon commentaire.) – Axeman

+0

merci de le signaler. Je crois toujours que votre réponse dans le commentaire est incomplète car je formaterais la date si c'était un problème sur lequel j'ai travaillé. – DataTx