如何在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
相关产品推荐
相关产品推荐

