2017-10-20 130 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