在合并数据的过程中,我经常会遇到列表列(例如左表中的一行在右表中有几个匹配)
让我们来定义
DT = data.table(x=list(c(1,2),c(3,4,5)),y=list(c(T,T),c(T,F,T)),z=c(1,2),N=c(1L,2L))
# x y z N
#1: 1,2 TRUE,TRUE 1 1
#2: 3,4,5 TRUE,FALSE,TRUE 2 2
update
x
就地修改为x[y]
?我可以做到但不更新(看起来很难看):
DT1 = DT[,list(x=list(unlist(x)[unlist(y)])),by=N]
DT = cbind(DT[,x:=NULL],DT1[,list(x)])
y z N x
1: TRUE,TRUE 1 1 1,2
2: TRUE,FALSE,TRUE 2 2 3,5
现在让我们假设我定义mySet = c(1,5)
并想要检查列x %in% mySet
我该怎么做?
y z N x isInMySet
1: TRUE,TRUE 1 1 1,2 TRUE,FALSE
2: TRUE,FALSE,TRUE 2 2 3,5 FASLE,TRUE
答案 0 :(得分:3)
另一种方法:
DT
x y z N
1: 1,2 TRUE,TRUE 1 1
2: 3,4,5 TRUE,FALSE,TRUE 2 2
DT[,x2:=mapply(`[`,x,y,SIMPLIFY=FALSE)]
DT
x y z N x2
1: 1,2 TRUE,TRUE 1 1 1,2
2: 3,4,5 TRUE,FALSE,TRUE 2 2 3,5
DT[,isInMySet:=lapply(x2,`%in%`,c(1,5))]
DT
x y z N x2 isInMySet
1: 1,2 TRUE,TRUE 1 1 1,2 TRUE,FALSE
2: 3,4,5 TRUE,FALSE,TRUE 2 2 3,5 FALSE,TRUE
答案 1 :(得分:2)
我为你之前的问题写了一个答案,意识到你已经删除了这个问题。以下是您可以更新的内容(第一部分的答案)。
DT[, x := list(list(unlist(x)[unlist(y)])), by=N]
# x y z N
# 1: 1,2 TRUE,TRUE 1 1
# 2: 3,5 TRUE,FALSE,TRUE 2 2
第二部分:
DT[, isInMySet := list(list(unlist(x) %in% mySet)), by=N]
# x y z N isInMySet
# 1: 1,2 TRUE,TRUE 1 1 TRUE,FALSE
# 2: 3,5 TRUE,FALSE,TRUE 2 2 FALSE,TRUE
(或者)
DT[, isInMySet := lapply(x, function(x) x %in% mySet)]