【问题标题】:Filter various columns with vectors using "on" with data.table使用带有 data.table 的“on”过滤带有向量的各种列
【发布时间】:2019-07-02 00:35:33
【问题描述】:

我想一次使用 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。

【问题讨论】:

  • 你在找DT[CJ(Sepal.Length=c(5, 6.2), Species=c("setosa", "virginica", "versicolor")), on = c( "Sepal.Length", "Species")]吗?
  • 为什么不只是 iris[Sepal.Length %in% c(5, 6.2) &amp; Species %in% c("setosa", "virginica", "versicolor") ,] ?还是您的意思是“一个过滤器,然后是另一个过滤器”?
  • %chin% 在 Species 列中会更快
  • 整数的 %chin% 比 %in% 快吗?即,如果必须执行 %in% 的千分之一,您会建议转换为角色吗?
  • %in% 表示整数,%chin% 表示字符

标签: r data.table


【解决方案1】:

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

原来如此

iris[Sepal.Length %in% c(5, 6.2) & Species %chin% c("setosa", "virginica", "versicolor"), ]

另外两点需要注意:

  • 如果要过滤 介于 5 和 6.2 之间的 Sepal.Lengths,可以将 %in% 更改为 %between%%inrange%。见?between?inrange
  • 使用%chin% (ch-aracter in) 来检查是否属于字符向量,它比普通的%in% 快得多。见?chmatch

【讨论】:

    猜你喜欢
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 2019-10-05
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2021-08-11
    相关资源
    最近更新 更多