使用data.table的“ on”过滤带有矢量的各列

时间:2019-07-02 00:35:33

标签: r data.table

我想一次高效地对data.table进行多个过滤。有没有办法通过“开启”来实现这一点。

出于效率考虑,我需要将其放在data.table中(我必须对数据集执行数百万个过滤器和摘要)

此带有dplyr的代码应在data.table中完成。 (希望使用与我尝试过的结构相同的结构,我可能会丢失一些东西)。

data("iris")

iris %>% filter(Sepal.Length %in% c(5, 6.2), 
         Species %in% c("setosa", "virginica", "versicolor"))

我尝试过

DT <- setDT(iris)

DT[.(c(5, 6.2), c("setosa", "virginica", "versicolor")),  on = c( "Sepal.Length", "Species")]

我知道我可以执行一个过滤器,然后再执行另一个过滤器,但是代码比较慢。

我得到警告:

  

在as.data.table.list(i)中:项目1的大小为2,但最大大小为3   (回收后剩余1件物品)

据我所知,它用“ setosa”过滤5个,用“ virginica”过滤6.2个,再用“ versicolor”过滤5个。

1 个答案:

答案 0 :(得分:1)

正如@thelatemail在评论中指出的那样,您只需将dplyr filter中的所有内容带到i的{​​{1}}部分(请记住:data.table的工作方式类似于DT [ filter_conditions,do_stuff,by_group] == data.table)。

应该是

DT[i, j, by]

还有两点需要注意:

  • 如果要过滤在 5和6.2之间的iris[Sepal.Length %in% c(5, 6.2) & Species %chin% c("setosa", "virginica", "versicolor"), ] ,可以将Sepal.Length换成%in%%between%。请参见%inrange%?between
  • 使用?inrange(输入字符)来检查字符向量中的所属,它比普通%chin%快得多。参见%in%