我有一个包含逻辑表达式的函数,用于对data.table的行进行子集.我希望通过一个字符串和一个表示函数参数的列名向量来调用该函数(类似于使用do.call).然而,我不知道如何接近这一意图.

在一个简单的、可重现的例子中:

#function with logical return value
myfunc <- function(mpg, cyl) {
  mpg/cyl > 7
}

#name of function
funcname <- "myfunc"

#vector of column names, corresponding to the function parameters
cols <- c("mpg", "cyl")

#data.table to be subsetted
dt <- setDT(copy(mtcars))

我正在寻找的是一个传递变量dtfuncnamecols的函数,以获得以下结果,因为它与dt[mpg/cyl > 7, ]相同:

#desired function
subsetfunc(dt, funcname, cols)

    mpg cyl disp  hp drat    wt  qsec vs am gear carb
1: 32.4   4 78.7  66 4.08 2.200 19.47  1  1    4    1
2: 30.4   4 75.7  52 4.93 1.615 18.52  1  1    4    2
3: 33.9   4 71.1  65 4.22 1.835 19.90  1  1    4    1
4: 30.4   4 95.1 113 3.77 1.513 16.90  1  1    5    2

推荐答案

这里有一种方法

subsetfunc <- function(data, funcstring, colnms) {
   data[get(funcstring)(data[[colnms[1]]], data[[colnms[2]]])]


}

-测试

> subsetfunc(dt, funcname, cols)
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
   <num> <num> <num> <num> <num> <num> <num> <num> <num> <num> <num>
1:  32.4     4  78.7    66  4.08 2.200 19.47     1     1     4     1
2:  30.4     4  75.7    52  4.93 1.615 18.52     1     1     4     2
3:  33.9     4  71.1    65  4.22 1.835 19.90     1     1     4     1
4:  30.4     4  95.1   113  3.77 1.513 16.90     1     1     5     2

或使用do.call

subsetfunc <- function(data, funcstring, colnms) {
   
   data[data[, do.call(funcstring, .SD), .SDcols = colnms]]
}

-测试

> subsetfunc(dt, funcname, cols)
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
   <num> <num> <num> <num> <num> <num> <num> <num> <num> <num> <num>
1:  32.4     4  78.7    66  4.08 2.200 19.47     1     1     4     1
2:  30.4     4  75.7    52  4.93 1.615 18.52     1     1     4     2
3:  33.9     4  71.1    65  4.22 1.835 19.90     1     1     4     1
4:  30.4     4  95.1   113  3.77 1.513 16.90     1     1     5     2

R相关问答推荐

将一个载体的值相加,直到达到另一个载体的值

使用rlang s arg_match判断函数输入列表

使用spatVector裁剪网格数据时出现的问题

Tidyverse/Djirr为从嵌套列表中提取的列名赋值的解决方案

向gggplot 2中的数据和轴标签添加大写和星号

如果行和大于值,则过滤

如何在xyplot中 for each 面板打印R^2

如何直接从R中的风险分数计算c指数?

如何在R中对深度嵌套的tibbles中的非空连续行求和?

在连续尺度上转置标签[瀑布图,R]

如何同时从多个列表中获取名字?

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

如何删除仅在数据集顶部和底部包含零的行

TreeNode打印 twig 并为其上色

汇总数据帧中的复制列,保持行的唯一性

R-找出存在其他变量的各种大小的所有组合

我正在try 创建一个接近cos(X)的值的While循环,以便它在-或+1-E10范围内

替换在以前工作的代码中有x行&q;错误(geom_sf/gganimate/dow_mark)

修复标签重叠和ggploy内的空间

从字符串列中的向量中查找第一个匹配的单词