【问题标题】:Filtering a data.table using two variables, an elegant fast way使用两个变量过滤 data.table,一种优雅的快速方式
【发布时间】:2017-10-11 14:51:30
【问题描述】:

我想问你是否有一种方法可以根据多个变量的组合进行过滤。具体来说:

library(dplyr)
library(plyr)
library(data.table)

data <- iris %>% cbind( group = rep(c("a", "b", "c"), nrow(iris))) %>% as.data.table()

   Sepal.Length Sepal.Width Petal.Length Petal.Width Species group
1:          5.1         3.5          1.4         0.2  setosa     a
2:          4.9         3.0          1.4         0.2  setosa     b
3:          4.7         3.2          1.3         0.2  setosa     c
4:          4.6         3.1          1.5         0.2  setosa     a
5:          5.0         3.6          1.4         0.2  setosa     b
6:          5.4         3.9          1.7         0.4  setosa     c

我想根据以下数据表过滤它们

filter <- data.table(Species = c("setosa", "versicolor", 'setosa'), group = c('a', "b", 'c'))
      Species group      filter1
1:     setosa     a     setosa a
2: versicolor     b versicolor b
3:     setosa     c     setosa c

我可以这样做:

data[paste(Species, group) %in% filter[, filter1 := paste(Species, group)]$filter1]

但是我想知道是否有一种更有效/更快/更容易的方法: 可能是这样的:

data[.(Species, group) %in% filter] # does not work

【问题讨论】:

  • @Jaap 我猜这个链接是为了更复杂的过滤操作,比如on=.(x = x, y != y)。在这里,我认为data[filter, on=names(filter), nomatch=0] 可能是目标,或者stackoverflow.com/questions/18969420/…
  • 是的,@Frank 确实回答了我的问题,也回答了我的问题。因为正如我所说,我正在寻找一种更优雅、更简单的方法来做到这一点。弗兰克的回答就够了,如果你写成答案,我可以接受。

标签: r data.table


【解决方案1】:

在这种情况下,你可以这样做

data[filter, on=names(filter), nomatch=0]

Perform a semi-join with data.table 用于类似的过滤连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 2017-01-25
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    相关资源
    最近更新 更多