dplyr:查找事件发生的日期

dplyr: Find date for which an event occurs

第一个问题。我是 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) 和某种过滤器是开始的地方,但我没有运气。

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

如果要创建新摘要table:

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) 以产生相同的结果。

如果您只是想删除您现在拥有的 table 的重复数据:

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

使用 dplyr,您几乎可以像描述中所写的那样执行此操作。

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

这是一个可能的 data.table 一个班轮。您可以同时在 i 表达式中按 page_views > 0L 过滤,在 j 表达式中查找 min(date),同时在 by 表达式中按 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