假设我读取了一些包含要在数据集中进行的操作的文件,例如

library(data.table)
dt = setDT(mtcars)
exp1 = "cyl == 8 & mpg > 16"
exp2 = "cyl == 6 & mpg < 20"

在这种情况下,exp1exp2作为文本从文件中读取,有没有方法可以做到这样的事情

dt[eval(exp1)]
dt[eval(exp2)]

使用文本表达对数据进行子集化并进行其他数据转换?

EDIT:

如果我做这样的事情

exp1 = quote(cyl == 8 & mpg > 16)
dt[eval(exp1)]

它有效,但我如何 Select 存储到文本中的数据来使用这种引用方法呢?还有使用这种方法有什么问题吗?

推荐答案

要在不显式使用eval(这通常是不受欢迎的)的情况下做到这一点,请使用do.call,如以下示例所示:

1) [要使用[.data.table,请try 以下操作:

library(data.table)

dt <- as.data.table(mtcars)
exp1 <- "cyl == 8 & mpg > 16"

do.call("[", list(dt, str2lang(exp1)))

     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
   <num> <num> <num> <num> <num> <num> <num> <num> <num> <num> <num>
1:  18.7     8 360.0   175  3.15 3.440 17.02     0     0     3     2
2:  16.4     8 275.8   180  3.07 4.070 17.40     0     0     3     3
3:  17.3     8 275.8   180  3.07 3.730 17.60     0     0     3     3
4:  19.2     8 400.0   175  3.08 3.845 17.05     0     0     3     2

2) subset使用subset也可以:

do.call(subset, list(dt, str2lang(exp1)))

3) lm/plot如果目标是随后将子集输入lmplot,则可以通过将3个参数中的每个参数作为传递到do.call的列表的单独组成部分传递给lm,从而一次性完成子集和对lm的调用.同样,我们成功避免了任何明确的eval电话.(这将仅使用dt代替quote(dt),但Call:行就会混乱.)

do.call("lm", list(mpg ~ ., quote(dt), subset = str2lang(exp1)))

## Call:
## lm(formula = mpg ~ ., data = dt, subset = cyl == 8 & mpg > 16)
...snip...

或与plot

do.call(plot, list(mpg ~ disp, dt, subset = str2lang(exp1)))

4) tidyverse使用tidyverse我们可以使用!!parse_expr(...)

library(dplyr)
library(rlang)

 dt %>% filter(!!parse_expr(exp1))

R相关问答推荐

基于两个现有列创建新列

将模拟变量乘以多个观测结果中的模拟变量

从多个前置日期中获取最长日期

编辑文件后编辑RhandsonTable

根据多个条件增加y轴高度以适应geom_text标签

如何将旋转后的NetCDF转换回正常的纬度/经度网格,并使用R?

传递ggplot2的变量作为函数参数—没有映射级别以正确填充美学

如何写商,水平线,在一个单元格的表在R

如何删除最后一个可操作对象

SHINY:使用JS函数应用的CSS样式显示HTML表格

基于R中的间隔扩展数据集行

如何在ggplot2中绘制具有特定 colored颜色 的连续色轮

在R中创建连续的期间

从多面条形图中删除可变部分

在gggraph中显示来自不同数据帧的单个值

在具有多个响应变量的比例堆叠条形图上方添加总计

为R中的16组参数生成10000个样本的有效方法是什么?

快速合并R内的值

基于R中的辅助向量中的值有条件地连接向量中的字符串

如何从嵌套数据中自动创建命名对象?在R中