如果A 是一个data.table,其字段a 的类型为list,条目本身是基本类型的向量,例如创建如下
A<-data.table(a=c(list(c("abc","def","123")),list(c("ghi","zyx"))),d=c(9,8))
和B 是一个带有原始条目向量的列表,例如创建如下
B<-list(c("ghi","zyx"))
并且您正在尝试查找A$a 的哪个(如果有)元素与B 匹配
A[sapply(a,identical,unlist(B))]
如果你只想要a中的条目
A[sapply(a,identical,unlist(B)),a]
如果你想要a的匹配索引
A[,which(sapply(a,identical,unlist(B)))]
如果 B 本身是一个与 A 具有相同结构的 data.table,例如
B<-data.table(b=c(list(c("zyx","ghi")),list(c("abc","def",123))),z=c(5,7))
并且您正在寻找两个列表的一列的交集,您需要相同顺序的向量元素。
# give the entry in A for in which A$a matches B$b
A[,`:=`(res=unlist(sapply(list(a),function(x,y){
x %in% unlist(lapply(y,as.vector,mode="character"))
},list(B[,b]),simplify=FALSE)))
][res==TRUE
][,res:=NULL][]
# get T/F for each index of A
A[,sapply(list(a),function(x,y){
x %in% unlist(lapply(y,as.vector,mode="character"))
},list(B[,b]),simplify=FALSE)]
请注意,您不能做这么简单的事情
setkey(A,a)
setkey(B,b)
A[B]
加入 A&B,因为您无法在 data.table 1.12.2 中键入 list 类型的字段
同样,你不能问
A[a==B[,b]]
即使 A 和 B 相同,因为 == 运算符尚未在 R 中为类型 list 实现