data.table:在i中传递逻辑条件列表

3

我需要编写一个长的脚本 (称之为“Script”),对 data.table 进行各种操作,然后对不同行子集应用几次。我希望能够做到以下几点:

condition <- "X>10"
source(Script)

在这里,脚本将包含许多以下内容:

dt[MAGIC(condition), .......]

这将使我能够将脚本和条件保持在不同的文件中(第二个是仅显示结果的markdown,我希望它在代码方面尽可能简单)。我不想复制每个条件的脚本,并手动更改,因为这样做太容易出错了。我尝试了许多parse、deparse、substitute、quote、as.expression、as.logical等组合,但似乎一直在摸索。如果有人能帮忙,我会非常感激!注意:我可以很容易地在dplyr中完成上述操作:
df %>% filter_(condition)

当然,我也可以将它转换回数据表格。

df %>% filter_(condition) %>% data.table()

...但我更愿意始终使用data.table(速度更快,喜欢语法等)


1
你可以使用 dt[eval(parse(text=condition))] - akrun
谢谢 @akrun !! - Andrea
1
或者像这样编写您的条件 cond = quote(X>10) 并执行 DT[eval(cond)] - 从代码角度来看,这实际上更简单,因为该条件被存储为有效的语言对象,并且需要较少的代码来评估它。quote 还会方便地失败,如果传递了无法解析的内容,例如 quote(x ^^ :) 而不是 "x ^^ :"。另外,小提示:filter_ 正在逐步淘汰,使用其他语法... 如果您想要一个链式操作,可以使用 DT %>% \[`(i = eval(e))`,我有时会使用 magrittr。 - Frank
1个回答

1
我们使用 eval(parse
setdT(dt)[eval(parse(text=condition))]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接