data.table行过滤器,当键的顺序不同时,使用另一个data.table

时间:2014-04-10 16:57:29

标签: r data.table

我正在学习如何使用data.table而我遇到了一个意想不到的问题。我有一个大数据集all,有几个索引,21列和~20K行。我将all聚合为2个索引列,并将其命名为fail。当我尝试使用all过滤fail行时,如果失败中的索引是all中的前两个索引,我只会成功。事实并非如此。如何告诉data.table忽略all fail不共享的set.seed(42) all<-data.table(rep= rep(1:2, each=15, 10), loc= rep(letters[1:15], 20), foo= sample(LETTERS), x=rnorm(n=300)) setkey(all, rep, loc, foo) #note that foo is last instead of 2nd, which would be its desired default position fail<- all[,sum(x) < -5, by=list(rep,loc)] setkey(fail, rep,loc) fail[V1==T] rep loc V1 1: 2 d TRUE 中的索引?

测试数据集:

all[fail[V1==T]]
        rep loc foo           x   V1
     1:   1   f   A -0.46972958 TRUE
     2:   1   f   B  0.18819303 TRUE
     3:   1   f   C -0.65850343 TRUE
     4:   1   f   D -0.88577630 TRUE
     5:   1   f   I  0.08489806 TRUE
     6:   1   f   K -2.44046693 TRUE
     7:   1   f   R -0.43144620 TRUE
     8:   1   f   T  1.81522845 TRUE
     9:   1   f   U -1.01759612 TRUE
    10:   1   f   W -2.11320011 TRUE

工作过滤器

setkey(all, rep, foo, loc) #foo moved from last to 2nd key
all[fail[V1==T]]
       rep foo loc  x   V1
    1:   2   d  NA NA TRUE

由于索引顺序改变而导致的非工作过滤器

{{1}}

1 个答案:

答案 0 :(得分:1)

我假设您不想重新键入all表(尽管这也可以解决问题)。使用data.table::merge做你想做的事吗?

merge(all, fail[V1==T], by = c("rep", "loc"))