我想一次高效地对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个。
答案 0 :(得分:1)
正如@thelatemail在评论中指出的那样,您只需将dplyr filter
中的所有内容带到i
的{{1}}部分(请记住:data.table的工作方式类似于DT [ filter_conditions,do_stuff,by_group] == data.table
)。
应该是
DT[i, j, by]
还有两点需要注意:
iris[Sepal.Length %in% c(5, 6.2) & Species %chin% c("setosa", "virginica", "versicolor"), ]
,可以将Sepal.Length
换成%in%
或%between%
。请参见%inrange%
和?between
?inrange
(输入字符)来检查字符向量中的所属,它比普通%chin%
快得多。参见%in%