3

在合并数据的过程中,我经常以列表列结束(例如左表中的一行在右表中有多个匹配项)

让我们定义

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
  1. 是否可以就地修改为update xaka 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

  1. 我怎样才能做到这一点 ?

                     y z N   x isInMySet
    1:       TRUE,TRUE 1 1 1,2 TRUE,FALSE
    2: TRUE,FALSE,TRUE 2 2 3,5 FASLE,TRUE
    
4

2 回答 2

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
于 2013-02-15T12:56:28.493 回答
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)]
于 2013-02-15T12:20:24.267 回答