如何在data.table中实现排序、分组、mutate操作复现dplyr效果
问题原因
你写的data.table代码和dplyr逻辑执行顺序不一致,核心问题是没有保证同id分组内的行是按date升序排列后再取首尾值:
- dplyr执行顺序:按id分组 → 组内按date排序 → 计算组内首尾值 → 全局按date排序输出
- 你写的data.table执行顺序:全局按date排序 → 按id分组 → 取原顺序的组内首尾值 → 输出时不会额外排序
修正代码
两种常用写法都可以得到和dplyr一致的结果:
写法1:分组后指定按date排序取首尾
setDT(test_df)[, `:=`( Amt_first = first(Amount[order(date)]), Amt_last = last(Amount[order(date)]) ), by = id][order(date)]
写法2:先按id+date全局排序再分组计算
setDT(test_df)[order(id, date), `:=`( Amt_first = first(Amount), Amt_last = last(Amount) ), by = id][order(date)]
补充说明
如果不想原位修改原数据集,可以先拷贝一份再操作:
test_dt <- copy(setDT(test_df)) # 后续操作在test_dt上执行即可
内容的提问来源于stack exchange,提问作者ViSa
相关产品推荐
相关产品推荐

