在查看其他表时,data.table出现意外结果

时间:2014-09-12 12:23:29

标签: r data.table

我正在尝试检查数据表中的值是否存在于另一个数据表中。但是,我没有得到正确的输出:

> dt1 <- data.table(x=c(8,5,3), y=rnorm(3))
> dt2 <- data.table(a=c(1,2,3,4,5), b=rnorm(5))
> setkey(dt1,x)
> setkey(dt2,a)
> 
> dt1
   x          y
1: 3 0.84929113
2: 5 1.33433818
3: 8 0.04170333
> dt2
   a           b
1: 1  2.00634915
2: 2 -1.53137195
3: 3 -1.49436741
4: 4 -1.66878993
5: 5 -0.06394713
> 
> dt1[,is_present_in_dt2:=nrow(dt2[x, nomatch=0L])]
> dt1
   x          y is_present_in_dt2
1: 3 0.84929113                 3
2: 5 1.33433818                 3
3: 8 0.04170333                 3

Expected result:


   x          y is_present_in_dt2
1: 3 0.84929113                 1
2: 5 1.33433818                 1
3: 8 0.04170333                 0

1 个答案:

答案 0 :(得分:6)

我认为这实际上比你想的更直接。可以将其视为i语句中d2的子设置d1。

dt1 <- data.table(x=c(8,5,3), y=rnorm(3))
dt2 <- data.table(a=c(1,2,3,4,5), b=rnorm(5))
setkey(dt1,x)
setkey(dt2,a)

dt1[dt2, presnt := 1] #Where they merge, make it a 1
dt1[!dt2, presnt := 0] #Where they don't merge, make it a 0

结果:

   x          y presnt
1: 3 -0.6938894      1
2: 5  0.4891611      1
3: 8 -1.8227498      0

另一种思考方式:

overlap <- intersect(dt1$x,dt2$a)
dt1[x %in% overlap, present := 1]
dt1[!(x %in% overlap), present := 0]

第一种方式更快。第二种方式可能有助于理解第一种方式。