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. in-place aka update xtoを変更することは可能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

そしてあなたの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 に答える