R中根据条件互换data.table指定行两列值的实现方法
实现方案
你可以直接用data.table自带的行筛选+原位赋值特性完成操作,写法简洁且效率很高,不需要生成额外的中间对象。
步骤1:构造测试数据
library(data.table) dt <- data.table(ID=c("A","A","B","B"),Amount1=c(100,200,300,400), Amount2=c(1500,1500,2400,2400),Dupl=c(1,8,1,0))
方案1:简洁写法(推荐)
仅需一行代码即可完成需求:
dt[Dupl == 8, c("Amount1", "Amount2") := .(Amount2, Amount1)]
说明:
i位置的Dupl == 8会先筛选出所有需要交换列值的行j位置的:=是data.table的原位赋值运算符,直接在原表上修改数据,不会产生拷贝- 右侧的
.()是list()的简写,按顺序把Amount2的值赋给Amount1、原Amount1的值赋给Amount2,直接完成交换
方案2:set函数写法(适合超大数据表)
如果你的表体量极大,追求极致性能,可以用set()函数实现,开销更低:
# 先筛选出符合条件的行索引 idx <- which(dt$Dupl == 8) # 暂存原Amount1的值避免覆盖 temp_amt1 <- dt$Amount1[idx] # 依次完成赋值 set(dt, i = idx, j = "Amount1", value = dt$Amount2[idx]) set(dt, i = idx, j = "Amount2", value = temp_amt1)
最终输出结果
两种方法运行后,打印dt即可得到你需要的结果:
> dt ID Amount1 Amount2 Dupl 1: A 100 1500 1 2: A 1500 200 8 3: B 300 2400 1 4: B 400 2400 0
内容的提问来源于stack exchange,提问作者SUMIT
相关产品推荐
相关产品推荐

