dplyr:查找事件发生的日期

时间:2015-03-12 19:31:50

标签: r dplyr

第一个问题。我是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)

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

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

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

3 个答案:

答案 0 :(得分:5)

如果您要创建新的摘要表:

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

答案 1 :(得分:3)

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

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

或者,如果您想要所有列,可以使用 S ub D ata(.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

答案 2 :(得分:2)

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

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