【问题标题】:dplyr: Find date for which an event occursdplyr:查找事件发生的日期
【发布时间】:2015-05-15 03:16:28
【问题描述】:

第一个问题。我是 R 的新手。我有以下数据框。

Source: local data frame [865,264 x 10]

   page_views       date dayofweek daytype   caseID dateDecision dateArgument dateRearg
1         169 2008-01-30 Wednesday       0 2007-001   2007-10-10   2007-10-01          
2         211 2008-01-16 Wednesday       0 2007-001   2007-10-10   2007-10-01          
3         203 2008-01-17  Thursday       0 2007-001   2007-10-10   2007-10-01          
4         177 2008-01-14    Monday       0 2007-001   2007-10-10   2007-10-01          
5         224 2008-01-15   Tuesday       0 2007-001   2007-10-10   2007-10-01          
6         152 2008-01-12  Saturday       1 2007-001   2007-10-10   2007-10-01          
7         149 2008-01-13    Sunday       1 2007-001   2007-10-10   2007-10-01          
8         220 2008-01-10  Thursday       0 2007-001   2007-10-10   2007-10-01          
9         169 2008-01-11    Friday       0 2007-001   2007-10-10   2007-10-01          
10        189 2008-01-18    Friday       0 2007-001   2007-10-10   2007-10-01          
..        ...        ...       ...     ...      ...          ...          ...       ...
Variables not shown: caseName (chr), term (int)

我想找到 page_views 大于零的每个 caseID 的第一个、最早的时间日期。我想用这个日期创建一个新列。每个 caseID 的结果应该有一行。

我希望我可以使用 dplyr 做到这一点,但我对其他解决方案持开放态度。使用 dplyr 似乎 group_by(caseID) 和某种过滤器是开始的地方,但我没有运气。

我搜索了 stackoverflow 和其他地方,但没有找到任何接近的东西。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    如果要新建汇总表:

    df %>%
      filter (page_views > 0) %>%
      group_by (caseID) %>%
      summarise (earliestDate = min(date))
    

    date 变量不能成为min 起作用的因素;不过,它可以是一个角色。

    输出

    Source: local data frame [1 x 2]
    
        caseID earliestDate
    1 2007-001   2008-01-10
    

    您可以将上述代码的最后一行替换为filter (min_rank(date) == 1) 以产生相同的结果。

    如果您只是想对现有的表进行重复数据删除:

    df %>%
      filter (page_views > 0) %>%
      group_by (caseID) %>%
      arrange (date) %>%
      slice(1) # takes the first row, which will be the earliest since the table is sorted by date
    

    输出

    Source: local data frame [1 x 8]
    Groups: caseID
    
      row page_views       date dayofweek daytype   caseID dateDecision dateArgument
    1   8        220 2008-01-10  Thursday       0 2007-001   2007-10-10   2007-10-01
    

    编辑:这是创建相同子集的一种更优雅的方式:

    df %>% group_by(caseID) %>%
      filter(page_views > 0, date == min(date))
    

    【讨论】:

    • 对于第二个选项:您可以放弃安排调用并使用 slice(which.min(date)) 代替(更简洁,也可能更快)。一个相关的问题是stackoverflow.com/questions/21308436
    • @docendodiscimus:我找到了这个相关的问题,但无法让它发挥作用。谢谢。
    • 这里提出的解决方案并不完全有效,我不知道为什么。第一个解决方案不会为每个 caseID 生成日期。有很多 NA。第二个生成每个 caseID 的第一个日期的列表。数据集是矩形的,因此一些第一个日期没有任何搜索活动。 (我没有在问题的描述中包含,但应该包含。Slice 对我来说是新的,谢谢。我从下面提出的解决方案中添加了一行并且它有效。df2 % filter (page_views > 0) %>% group_by (caseID) %>% 安排 (date) %>% slice(1)
    • 我想知道为什么第一个解决方案对您不起作用 - 一定是您发布的示例中不存在的数据的某些方面。第二个解决方案中缺少filter() 的好消息;我已经更新了答案以添加它。感谢您的反馈。
    【解决方案2】:

    这是一个可能的data.table 一个班轮。您可以同时在i 表达式中按page_views > 0L 过滤,在j 表达式中找到min(date),同时在caseID 表达式中按caseID 聚合

    library(data.table)
    setDT(df)[page_views > 0L, min(date), caseID]
    #      caseID         V1
    # 1: 2007-001 2008-01-10
    

    或者如果你想要所有的列,你可以使用 SubData (.SD) 如

    setDT(df)[page_views > 0L, .SD[which.min(date)], caseID]
    #      caseID page_views       date dayofweek daytype dateDecision dateArgument
    # 1: 2007-001        220 2008-01-10  Thursday       0   2007-10-10   2007-10-01
    

    【讨论】:

      【解决方案3】:

      使用 dplyr,您几乎可以按照描述中的说明进行操作。

      x %>% group_by(caseID) %>% filter(page_views > 0) %>%
            arrange(date) %>% summarise(min_date=head(date,1))
      

      【讨论】:

      • 这个解决方案完全符合我的要求。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-13
      • 1970-01-01
      • 2020-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      相关资源
      最近更新 更多