【发布时间】:2020-04-02 20:27:36
【问题描述】:
我在 R 中有一些代码:
library(dplyr)
df_temp <- df %>%
group_by(policy_number, policy_year) %>%
summarise(term_start_date = last(term_start_date),
term_end_date = last(term_end_date),
on_cover_after = last(on_cover_after),
termination_code = last(termination_code),
termination_date = last(termination_date))
主表df 大约有 700,000 行 x 130 列。按policy_number 和policy_year 分组,大约有300,000 个(policy_number/policy_year)分组。
我在last() 中提到的 5 列中有 4 列是日期。
这个查询运行大约需要 3 分钟,这很麻烦,因为我的其余代码运行得非常快。我希望能加快速度。请问有什么我可以尝试的方法吗?
(理想情况下会提供一个代表,但我怎么能在这里做到这一点?不确定)
谢谢。
编辑:由于我总是使用给定 (policy_number/policy_year) 对的最后一条记录,因此我可以编写以下代码:
df_temp <- df %>%
group_by(policy_number, policy_year) %>%
mutate(counter = 1:n()) %>%
filter(counter == max(counter)) %>%
select(term_start_date,
term_end_date,
on_cover_after,
termination_code,
termination_date)
?
【问题讨论】:
-
您可以通过共享代码来提供一个代表来模拟数据。首先使用
set.seed,这样它就可以完全重现。类似n = 7e5; df = tibble(policy_number = sample(1:1e5, size = n, replace = TRUE), policy_year = sample(2017:2019, size = n, replace = TRUE), ...) -
至于您的编辑,
df %>% group_by(policy_number, policy_year) %>% select(term_start_date, term_end_date, on_cover_after, termination_code, termination_date) %>% slice(n())会起作用。不确定它是否更快。将selectbefore 放在summarize(或slice,在这种情况下)可能也有帮助。添加一些数据,我们会做一些基准测试。 -
是否存在行顺序所基于的列?提供一个有助于了解的
data.table解决方案。