第一个问题。我是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和其他地方,但没有找到任何接近的地方。
答案 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))