2017-10-20 132 views
1

一個data.frame我想,我有一個數據幀上工作,但我在努力尋找一個名字和一個名稱相關聯的總和相關的最新日期。我的框架看起來是這樣的使用for循環變異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  

我想獲得這樣的

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 

我使用表函數,然後使用一個for循環開始,但我是一個有點菜鳥。

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])) 
} 

這將返回我看起來像這樣

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 

數據幀我怎樣才能確保總和僅僅是約翰尼,簡的同時,該日期爲與該名稱關聯的最新日期

+2

'庫(dplyr); df%>%group_by(Name)%>%summarize(Total_Sum = sum(Sum),Latest_Date = max(Date))'應該有效。 – Axeman

+0

另請參閱此處(https://stackoverflow.com/questions/1660124/how-to-sum-a-variable-by-group)。 – Axeman

+0

美麗。謝謝! –

回答

-2

您可以使用dplyr R Package中的group_bysummarise

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

c <- a %>% 
    count(Name) 

df <- left_join(b, c) 
+0

'summarise'刪除最後一個組,因此雙'summarise'將在這種情況下返回一行...除了它失敗,因爲'Date'列甚至不存在了。另外,你應該有'sum(Sum)',並且你缺少一個管道。 – Axeman

+0

是的,我試過使用它,它適用於總和,但正如Axeman所說,如果我使用max($ date),使用max(date)將返回一個單行,將給出未找到對象的錯誤。 –

+0

@Axeman你是對的。我編輯代碼。謝謝。 – patL

0

這應該工作:

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 
+0

OP在詢問最新日期,而不是第一次。 (另見我的評論。) – Axeman

+0

感謝您指出。我仍然相信你在評論中的回答是不完整的,因爲如果這是我工作的問題,我會格式化日期。 – DataTx