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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:21:02