使用data.table按组shift生成滞后值报错的原因与解决
解决data.table按组取滞后值的报错问题
我来帮你搞定这个问题!你遇到的报错核心原因很明确:你的数据对象是普通的data.frame,而非data.table对象,所以data.table专属的语法(比如:=原地修改、[操作里的by参数)无法在data.frame上生效。
第一步:转换数据类型为data.table
你需要先把现有的data.frame转换成data.table,推荐用高效的原地转换方法:
library(data.table) setDT(DT) # 原地转换,不会复制数据,速度快
如果你是从外部文件读取数据,也可以直接用data.table的fread()函数读取,直接得到data.table对象:
DT <- fread("你的数据文件路径.csv")
第二步:运行按组取滞后值的代码
转换完成后,你就可以正常运行按组生成滞后点击时间的代码了。这里建议直接指定click_time列,比用.SD更高效清晰:
DT[, last_click_time := shift(click_time), by = unique_id]
运行后,每个unique_id分组的第一行last_click_time会是NA(因为没有前一行数据),后续行则会对应上一行的click_time,完全符合你的需求。
为什么之前会报错?
普通data.frame的[子集操作并不支持by这个参数,也不认识:=这种原地修改列的语法。当你用data.frame去执行data.table的代码时,R会把它当成普通的data.frame操作,自然会抛出「unused argument (by = unique_id)」的错误——哪怕你替换了click_time的值,只要对象类型不对,问题就会存在。
你可以用class(DT)来验证转换后的类型,确认输出是"data.table" "data.frame"就没问题了。
内容的提问来源于stack exchange,提问作者user137698
相关产品推荐
相关产品推荐

