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