2017-08-25 19 views
1

首先,我创建一个data.table。为什么我在data.table中使用'on'可以使“NA”

set.seed(100) 
    a <- data.table(x = sample(c(1:1000),100000,replace = TRUE), 
       y = sample(letters,100000,replace = TRUE), 
       z = 1:100000) 

我使用一种方法a[x >= 900 & y == 'b', .N],则结果是389

然后,我使用另一种方法a[.(c(900:max(x)),'b'), .N, on = .(x,y)],结果是394

我发现第二方法可以使“NA”

a[.(c(900:max(x)),'b'), on = .(x,y)][is.na(z)]

WHY ??

回答

3

如果我们使用nomatch=0,该NA元素将会消失

a[.(c(900:max(x)),'b'), .N, on = .(x,y), nomatch = 0] 
#[1] 389 

的原因是,我们正在采取的顺序从900到的“X”的max值。所以一些元素缺失。例如

a[.(c(900:max(x)),'b'), on = .(x,y)][is.na(z)] 
# x y z 
#1: 948 b NA 
#2: 958 b NA 
#3: 975 b NA 
#4: 984 b NA 
#5: 986 b NA 

这将导致NA元素“Z”,就像我们正在做一个left加入。

其原因是,这些元素缺少该组合

c(948, 958, 975, 984, 986) %in% a[x > 900 & y == "b"][, sort(unique(x))] 
#[1] FALSE FALSE FALSE FALSE FALSE 
+0

@ Gauss.Y当然,我更新后 – akrun

+1

是,'一[X == 948,唯一的(Y)]',” b“不在结果中。谢谢! –

相关问题