如何用data.table通过双列关联为DT1新增ref列(匹配行设1)
给data.table新增匹配标记列的解决方案
需求:现有两个R语言data.table对象DT1和DT2,通过id1=id3、id2=id4两列关联,为DT1新增名为ref的列——若DT1的行在DT2中存在匹配项,ref设为1,否则设为0。
示例数据
DT1 <- data.table( id1 = c('A','B','C', 'D'), id2 = c(1,2,3,4) ) DT2 <- data.table( id3 = c('B','D','F'), id4 = c(2,4,5) )
DT1初始数据:
id1 id2 A 1.00000 B 2.00000 C 3.00000 D 4.00000
DT2初始数据:
id3 id4 B 2.00000 D 4.00000
你尝试的代码问题
你写的result <- DT1[DT2, on = c(id1='id3', id2='id4')]是右连接逻辑,只会保留DT1中能匹配DT2的行,无法保留DT1全部行并标记匹配状态,所以达不到预期。
正确解法
方法1:左连接后补全标记
先通过左连接给匹配行标记1,再将未匹配的NA值替换为0:
# 左连接DT2,给匹配行设置ref=1 result <- DT1[DT2, on = c(id1='id3', id2='id4'), ref := 1] # 未匹配的行ref设为0 result[is.na(ref), ref := 0]
方法2:直接判断每行是否存在匹配
利用data.table的.EACHI参数逐行判断匹配:
DT1[, ref := as.integer(DT2[.SD, on = c(id3='id1', id4='id2'), .N > 0, by = .EACHI]$V1)]
方法3:通过键匹配
先给DT2设置关联键,再用%in%判断:
setkey(DT2, id3, id4) DT1[, ref := as.integer(.SD %in% DT2)]
期望结果
id1 id2 ref A 1.00000 0 B 2.00000 1 C 3.00000 0 D 4.00000 1
内容的提问来源于stack exchange,提问作者Daoudi Karim
相关产品推荐
相关产品推荐

