如何处理data.table中的列列

时间:2013-02-15 12:15:25

标签: r data.table

在合并数据的过程中,我经常会遇到列表列(例如左表中的一行在右表中有几个匹配)

让我们来定义

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 x就地修改为x[y]
  2. 我可以做到但不更新(看起来很难看):

    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
      

2 个答案:

答案 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)]