You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在data.table中链式执行排序、分组、新增列、数据透视操作

问题原因
  • 核心错误为列名拼写不匹配:你通过:=创建的新列名为Amt_last(last首字母为小写l),但melt函数中measure.vars参数写入的是Amt_Last(last首字母为大写L),data.table无法识别不存在的列,因此触发报错。
  • 如果你需要和dplyr示例完全一致的输出排序,可以在melt后增加排序步骤对齐规则。
正确实现代码
library(data.table)
library(lubridate)
library(tidyverse)

# 测试数据构造
test_df <- data.frame(id = c(1234, 1234, 5678, 5678),
                      date = c("2021-10-10","2021-10-10", "2021-8-10", "2021-8-15"),
                      Amount  = c(54767, 96896, 34534, 79870)) %>% 
  mutate(date = ymd(date))

# 转换为data.table并实现对应逻辑
setDT(test_df)
test_df[order(date),
        `:=`(Amt_first = first(Amount),
             Amt_last = last(Amount)), 
        by = id] %>% 
  melt(measure.vars = c("Amt_first","Amt_last"),
       variable.name = "Amt_catg", value.name = "Amt_val") %>% 
  setorder(date, id) # 可选,对齐dplyr按日期、id排序的输出规则
输出结果
id       date Amount  Amt_catg Amt_val
1: 5678 2021-08-10  34534 Amt_first   34534
2: 5678 2021-08-10  34534  Amt_last   79870
3: 5678 2021-08-15  79870 Amt_first   34534
4: 5678 2021-08-15  79870  Amt_last   79870
5: 1234 2021-10-10  54767 Amt_first   54767
6: 1234 2021-10-10  54767  Amt_last   96896
7: 1234 2021-10-10  96896 Amt_first   54767
8: 1234 2021-10-10  96896  Amt_last   96896

内容的提问来源于stack exchange,提问作者ViSa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 20:48:02