繁体   English   中英

基于另一个数据表的多个列值对一个数据表上的行进行子集

[英]Subset rows on one datatable based on multiple column values of another datatable

我有两个数据表。 原来的样子是这样的:

library(data.table)
DT <- data.table(
  x = rep(c("b", "a", "c"), each = 3),
  v = rep(c("d", "e", "f"), times = 3),
  foo = 10:18
)

DT
#>    x v foo
#> 1: b d  10
#> 2: b e  11
#> 3: b f  12
#> 4: a d  13
#> 5: a e  14
#> 6: a f  15
#> 7: c d  16
#> 8: c e  17
#> 9: c f  18

第二个看起来像这样:

X <- data.table(x = c("c", "b"), v = c("d", "f"))

X
#>    x v
#> 1: c d
#> 2: b f

我想对DT中其值在X的列值中的行进行子集化。

这就是我想要做的:

DT[x %chin% X$x & v %chin% X$v]
#>    x v foo
#> 1: b d  10
#> 2: b f  12
#> 3: c d  16
#> 4: c f  18

但我有 50 个这样的专栏。

有没有简洁的data.table方法来实现这一目标?

我尝试使用on参数,但没有返回所需的 output:

DT[X, on = colnames(X)]
#>    x v foo
#> 1: c d  16
#> 2: b f  12

您可以将条件生成为表达式:

cols <- colnames(X)
condition = parse(text=paste0(cols,' %chin% X$', cols, collapse = ' & ')) 

condition
#> expression(x %chin% X$x & v %chin% X$v)

DT[eval(condition)]
#>         x      v   foo
#>    <char> <char> <int>
#> 1:      b      d    10
#> 2:      b      f    12
#> 3:      c      d    16
#> 4:      c      f    18

解决问题的另一种方法:

cols = colnames(X)

DT[do.call(pmin, Map(`%chin%`, DT[, ..cols], X[, ..cols]))==1]

# or

DT[rowSums(mapply(`%chin%`, DT[,..cols], X[,..cols]))==length(cols)]

        x      v   foo
   <char> <char> <int>
1:      b      d    10
2:      b      f    12
3:      c      d    16
4:      c      f    18

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM