【问题标题】:Create new variable with most recent date by group in dplyr在 dplyr 中按组创建具有最近日期的新变量
【发布时间】:2020-08-31 17:23:53
【问题描述】:

我有一个数据框,我想用Id 为该组创建 2 个新变量。 首先我需要按Id 分组并通过createdDate 获取最近的日期然后我需要根据最近的日期再次获取Lead_DataSource__c

这是我的数据框的尾部;

tail(df)


Id                  CreatedDate Lead_DataSource__c   StageName
0011000001XW3YZAA1  2020-07-17            Walk in   Quotation
0011000001XW3Z8AAL  2020-07-17            Walk in   Quotation
0011000001XW3zHAAT  2020-07-17            Walk in    Assigned
0011000001XW3zlAAD  2020-07-17            Walk in   Quotation
0011000001XW3zvAAD  2020-07-17            Walk in Closed Lost
0011000001XW3zvAAD  2020-07-17            Website Closed Lost

这是我的代码:

df_new<-df %>% group_by(Id)%>%
 mutate(numberoflead=length(Id)) %>% #number of lead
  mutate(lastcreateddateoflead=max(CreatedDate)) %>%#last date of lead
  mutate(lasttouch =max(CreatedDate)[Lead_DataSource__c])%>% #last touch

当我运行这些代码时,我没有收到任何错误,它似乎适用于 numberofleadslastcreateddateoflead,但它似乎不适用于获取 lasttouch

任何人都可以帮助我了解我在这里缺少的东西吗?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    你的问题是你使用mutate,而你应该使用summarize。然后你需要加入原来的df才能得到lasttouch。如果您在联接中添加select,则无需重命名或选择任何内容即可获得lasttouch 列。

    library(dplyr)
    
    df %>%
      group_by(Id) %>%
      summarize(numberoflead = n(),
                lastcreateddateoflead=max(CreatedDate)) %>%
      inner_join(df %>% 
                   select(Id, CreatedDate, lasttouch = Lead_DataSource__c),
                 by = c("Id" = "Id", "lastcreateddateoflead" = "CreatedDate"))
                
    `summarise()` ungrouping output (override with `.groups` argument)
    # A tibble: 6 x 4
      Id                 numberoflead lastcreateddateoflead lasttouch
      <chr>                     <int> <date>                <chr>    
    1 0011000001XW3YZAA1            1 2020-07-17            Walk in  
    2 0011000001XW3Z8AAL            1 2020-07-17            Walk in  
    3 0011000001XW3zHAAT            1 2020-07-17            Walk in  
    4 0011000001XW3zlAAD            1 2020-07-17            Walk in  
    5 0011000001XW3zvAAD            2 2020-07-17            Walk in  
    6 0011000001XW3zvAAD            2 2020-07-17            Website  
    

    如果您想保留所有行(而不仅仅是每个 Id 一个摘要),请使用您的 mutate 而不是我的 summary。

    df %>%
      group_by(Id) %>%
      mutate(numberoflead = n(),
                lastcreateddateoflead=max(CreatedDate)) %>%
      inner_join(df %>% 
                   select(Id, CreatedDate, lasttouch = Lead_DataSource__c),
                 by = c("Id" = "Id", "lastcreateddateoflead" = "CreatedDate"))
    
    # A tibble: 8 x 7
    # Groups:   Id [5]
      Id             CreatedDate Lead_DataSource_~ StageName  numberoflead lastcreateddateofl~ lasttouch
      <chr>          <date>      <chr>             <chr>             <int> <date>              <chr>    
    1 0011000001XW3~ 2020-07-17  Walk in           Quotation             1 2020-07-17          Walk in  
    2 0011000001XW3~ 2020-07-17  Walk in           Quotation             1 2020-07-17          Walk in  
    3 0011000001XW3~ 2020-07-17  Walk in           Assigned              1 2020-07-17          Walk in  
    4 0011000001XW3~ 2020-07-17  Walk in           Quotation             1 2020-07-17          Walk in  
    5 0011000001XW3~ 2020-07-17  Walk in           Closed Lo~            2 2020-07-17          Walk in  
    6 0011000001XW3~ 2020-07-17  Walk in           Closed Lo~            2 2020-07-17          Website  
    7 0011000001XW3~ 2020-07-17  Website           Closed Lo~            2 2020-07-17          Walk in  
    8 0011000001XW3~ 2020-07-17  Website           Closed Lo~            2 2020-07-17          Website 
    

    【讨论】:

    • 它在我的数据帧的一个较小子集上运行良好,但是当我将上面的代码运行到我的完整数据帧时,它运行了很长时间并最终崩溃。我认为问题可能出在加入时我的数据框的 400 万行。除了inner_join,你知道解决这个问题的其他方法吗?
    【解决方案2】:

    嘿,我想我明白了你想要做的事情,但它可能表述得不太恰当。我相信您想要每个Id 的最大日期,然后是每个Lead_DataSource__c 的最大日期,如果您想要这样做,可以尝试:

    df_new <- df %>% group_by(Id) %>%
     mutate(numberoflead=length(Id)) %>% #number of lead
     mutate(lastcreateddateoflead=max(CreatedDate)) %>%
     group_by(Lead_DataSource__c) %>% 
     mutate(lasttouch =max(CreatedDate)) %>%
     ungroup()
    

    让我知道这是否是你想要完成的!

    【讨论】:

    • 您能否提供更多关于它不起作用的详细信息?它是返回 lasttouch 列的 NA 还是返回错误的值?
    猜你喜欢
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 2023-03-24
    相关资源
    最近更新 更多