如何将dat2的codes值替换为dat1中匹配code1/code2的code3值?
解决方案
可以通过将宽格式的dat1转为长格式,再利用data.table的连接匹配功能实现需求,具体步骤如下:
完整代码实现
library(data.table) # 加载示例数据 dat1 <- fread("code1 code2 code3 A3 B2 C1 A4 B3 C2") dat2 <- fread("codes A3 A4 B2 B3") # 1. 将dat1转换为长格式:把code1、code2合并为一列,对应各自的code3 dat1_long <- melt(dat1, id.vars = "code3", measure.vars = c("code1", "code2"), value.name = "codes")[, .(codes, code3)] # 2. 左连接匹配,替换dat2的codes值 dat2[dat1_long, on = "codes", codes := i.code3] # 最终结果就是dat2,也可以赋值给dat_out dat_out <- dat2
步骤解释
- 转长格式:
使用melt()函数把dat1的code1和code2列合并为名为codes的单列,同时保留对应的code3值。处理后dat1_long的结构为:codes code3 1: A3 C1 2: A4 C2 3: B2 C1 4: B3 C2 - 连接替换:
利用data.table的X[Y, on = key, col := i.col]语法,在dat2中匹配dat1_long的codes列,直接将dat2$codes替换为对应的dat1_long$code3值。这种方式高效且符合data.table的操作习惯。
运行后dat_out的结果完全符合你的期望输出。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

