如何用R data.table判断列值是否存在于对应列表列中
解决data.table中逐行判断值是否存在于对应列表列的问题
原始数据
先创建示例data.table:
library(data.table) dx <- data.table(x=c(1,2,3),tet=list(c(1,2,3),c(4,5),c(3)))
生成的表格如下:
x tet 1: 1 1,2,3 2: 2 4,5 3: 3 3
需求说明
需要新增test列,判断每行的x值是否存在于对应行的tet列表中,期望结果为:
x tet test 1: 1 1,2,3 TRUE 2: 2 4,5 FALSE 3: 3 3 TRUE
错误尝试及原因
直接执行dx[, test:= x %in% tet]会得到错误结果:
x tet test 1: 1 1,2,3 FALSE 2: 2 4,5 FALSE 3: 3 3 TRUE
问题出在x %in% tet是将整个x向量与整个tet列表做批量匹配,而非逐行对应比较每个x值和其所在行的tet列表。
正确实现方法
以下是几种可行的解决方案:
方法1:用mapply逐行匹配
利用mapply对每行的x和tet做对应匹配:
dx[, test := mapply(function(val, lst) val %in% lst, x, tet)]
方法2:借助data.table的by = .I逐行处理
通过by = .I实现逐行操作,确保每行的x只和本行的tet列表比较:
dx[, test := x %in% tet[[1]], by = .I]
方法3:使用purrr包的map2_lgl
如果习惯tidyverse工具链,也可以用purrr的map2_lgl生成逻辑判断结果:
library(purrr) dx[, test := map2_lgl(x, tet, ~ .x %in% .y)]
运行任意一种方法后,都会得到符合预期的结果。
内容的提问来源于stack exchange,提问作者Zentaur
相关产品推荐
相关产品推荐

