在R语言data.table中如何通过链式操作实现分组排序复现dplyr结果?
错误点梳理
你编写的data.table代码存在3个核心问题:
- 不符合data.table的
DT[i, j, by]语法规则:第一个参数位i用于行过滤,不需要指定by = Date,额外加的by参数会导致过滤逻辑完全失效 - 取值逻辑和需求不符:
.SD[1]仅能返回每个分组的第一条数据,和dplyr代码中slice_max(n=10)取前10条的目标不一致 - 管道混用问题:data.table原生支持
DT[][]的链式调用,不需要借用dplyr的%>%管道,混用容易出现环境调用异常
正确实现代码
# 预计算最大日期,避免重复运算提升执行效率 max_dt <- max(df_ind_stacked_daily$Date) # data.table实现,与你提供的dplyr代码结果完全一致 dt_res <- df_ind_stacked_daily[ # 行过滤逻辑 Daily_cases_type == "Daily_confirmed" & Date >= max_dt - 6 & Date <= max_dt & State.UnionTerritory != "India", # 分组取每个日期下病例数前10的记录 order(-Daily_cases_counts), .SD[1:10], by = Date ]
结果验证
你可以通过以下代码确认两者结果一致:
dplyr_res <- df_ind_stacked_daily %>% as_tibble() %>% filter(Daily_cases_type == "Daily_confirmed", Date >= max(Date) - 6 & Date <= max(Date), State.UnionTerritory != "India" ) %>% group_by(Date) %>% slice_max(order_by = Daily_cases_counts, n = 10) %>% ungroup() # 忽略行序对比结果,返回TRUE说明完全一致 all.equal(dt_res, as.data.table(dplyr_res), ignore.row.order = TRUE)
额外效率提示
你做基准测试时可以注意:将max(Date)预计算出来存为变量,比在过滤条件中每次重复计算max(Date)的执行效率更高,数据量越大差异越明显。
内容的提问来源于stack exchange,提问作者ViSa
相关产品推荐
相关产品推荐

