如何将data.table的Amount2列上移一行并填充末行0?
在data.table中实现列向上移位并末行填充0
原始数据
首先定义原始data.table:
library(data.table) Category <- c('A','A','A','A') Year <- c(0,1,2,3) Amount1 <- c(0,100,200,300) Amount2 <- c(0,30,40,0) dt_1 <- data.table(Category, Year, Amount1, Amount2) dt_1
原始表输出:
Category Year Amount1 Amount2
1: A 0 0 0
2: A 1 100 30
3: A 2 200 40
4: A 3 300 0
目标效果
需要得到的目标表:
Category <- c('A','A','A','A') Year <- c(0,1,2,3) Amount1 <- c(0,100,200,300) Amount2 <- c(30,40,0,0) dt_2 <- data.table(Category, Year, Amount1, Amount2) dt_2
目标表输出:
Category Year Amount1 Amount2
1: A 0 0 30
2: A 1 100 40
3: A 2 200 0
4: A 3 300 0
解决方案
方法1:使用data.table内置的shift函数
shift是data.table专为移位操作设计的函数,用type="lead"可以实现向上取后一行的值,之后将末行的NA替换为0:
# 链式操作直接生成目标表 dt_2 <- dt_1[, Amount2 := shift(Amount2, type = "lead")][is.na(Amount2), Amount2 := 0]
shift(Amount2, type = "lead"):将Amount2列的每个值替换为下一行的对应值,实现向上移位[is.na(Amount2), Amount2 := 0]:移位后最后一行会出现NA,这里将其替换为0
方法2:使用基础索引拼接
直接通过索引截取Amount2的后n-1个元素,再拼接0赋值回去,逻辑更直观:
# 先复制原始表避免修改原数据 dt_2 <- copy(dt_1) # 重新赋值Amount2列:取原列除第一个元素外的所有值,末尾加0 dt_2$Amount2 <- c(dt_2$Amount2[-1], 0)
两种方法都能实现需求,方法1更贴合data.table的语法风格,适合处理大数据量;方法2逻辑简单易懂,适合小数据集快速操作。
内容的提问来源于stack exchange,提问作者highbury
相关产品推荐
相关产品推荐

