Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在相同条件下为多列筛选data.table_R_Data.table - Fatal编程技术网

R 在相同条件下为多列筛选data.table

R 在相同条件下为多列筛选data.table,r,data.table,R,Data.table,我使用列名向量来选择data.table的一个子集。我想知道是否可以在I中基本上定义条件,然后将这些条件应用于所有选定的列。 例如,使用mtcars数据集。 我想选择圆柱和齿轮,然后想过滤所有有四个圆柱和四个齿轮的汽车。当然,我还需要定义过滤器是否为和或或,但我感兴趣的是,这个想法是否可以以某种方式应用于data.table上下文中 # working code sel.col <- c("cyl", "gear") dt <- data.table(mtcars[1:4,]) d

我使用列名向量来选择data.table的一个子集。我想知道是否可以在
I
中基本上定义条件,然后将这些条件应用于所有选定的列。 例如,使用
mtcars
数据集。 我想选择圆柱和齿轮,然后想过滤所有有四个圆柱和四个齿轮的汽车。当然,我还需要定义过滤器是否为
,但我感兴趣的是,这个想法是否可以以某种方式应用于
data.table
上下文中

# working code
sel.col <- c("cyl", "gear")
dt <- data.table(mtcars[1:4,])

dt[, ..sel.col]
dt[cyl == 4 & gear == 4, ..sel.col]    


# Non-working code
dt[ sel.col == 4 , ..sel.col]
#工作代码

sel.col我们可以使用
get

sel.col <- "cyl"
dt[get(sel.col) == 4, ..sel.col]
#    cyl gear
#1:   4    4

之前,我们认为只有一列需要评估。如果我们有多个列,请在
.SDcols
中指定它,循环遍历Data.table(
.SD
)的子集,将其与感兴趣的值('4')进行比较,
将其减少为逻辑向量,并使用
|
,即每行中的任何TRUE,并基于此对行进行子集化

dt[dt[, Reduce(`|`, lapply(.SD, `==`, 4)),.SDcols = sel.col], ..sel.col]

但无法将其更改为
条件,对吗?@hannes101我没有收到您的查询。目前所有列都需要具有相同的值,另一种可能是只需要满足其中一个条件,例如,只有四个齿轮或四个气缸。然后结果会有更多可能的组合。是的,似乎有效。虽然它很难阅读,而且我可能很难再掌握它,但在几个月后查看代码时。@hannes101如果向量中有多个元素,最好通过这条路线。或者你可以做
dt[get(sel.col[1])==4 | get(sel.col[2])==4,…sel.col]
当“sel.col”的长度增加时,这将成为一个练习。有什么相关问题:。
dt[dt[, Reduce(`|`, lapply(.SD, `==`, 4)),.SDcols = sel.col], ..sel.col]