[英]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.