如何在R中创建用户输入的小于或大于(或等于)变量?

时间:2014-06-25 13:20:10

标签: r subset

我正在编写一个函数,允许某人将3个数据集传递给函数,然后根据大于/小于/等于数据集中的一个变量对合并数据集进行子集化。如下所示:

myfunc <- function(data1, data2, data3, subsetvariable, gle, criterion){
....
....
}

其中data1,2,3是数据集,subsetvariable类似于年龄或体重,标准类似于20年,145磅等。变量gle大于/小于/等于用户应该能够进入该功能。

在函数内部我会有:

data <- data[data$age > 30,]

简单地将年龄的子集变量和30的标准变量放入到位很容易,但是如何通过“&gt;”进入功能?

感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

你可以传递“&lt;”作为一个角色。只需使用?match.fun调用正确的函数即可。

fct <- function(a, b, gle){
  gle <- match.fun(gle)
  gle(a, b)
}
identical(fct(1, 0:3, "<"), 1<0:3)
identical(fct(1, 0:3, ">="), 1>=0:3)

答案 1 :(得分:1)

你可以让用户2个字母表示大于,小于或等于某些语言,并使用if else语句。

gt =大于

ge =大于或等于

eq =等于

lt =小于

le =小于或等于

答案 2 :(得分:0)

虽然您可能能够使用非标准评估来直接将字符插入到评估中,但最简单的可能是使用条件语句。

假设大于/小于/等于的用户输入称为eq_sym。做这样的事情:

test <- switch(eq_sym, '>' = data$age > 30, '<' = dat$age < 30, '=' = data$age == 30, NA)
if (is.na(test)) {
    stop("must be >, <, or =")
} else {
    data <- data[test,]
}

答案 3 :(得分:0)

这是一个允许您以与subset相同的方式传递完整表达式的版本。无需分别对列,函数和值进行操作:

df1 <- data.frame(a=letters, b=1:26)
df2 <- data.frame(a=letters, c=LETTERS, age=21:46)

myfunc(df1, df2, age > 43)

这将返回合并的两个数据帧,并通过表达式age > 43返回子集:

   a  b c age
24 x 24 X  44
25 y 25 Y  45
26 z 26 Z  46

以下是来源:

myfunc <- function(data1, data2, subsetcommand) {
  data <- merge(data1, data2)
  sub.call <- bquote(subset(data, .(substitute(subsetcommand))))
  eval(sub.call)
}

诀窍是在我们的合并数据集上创建subset调用,然后substitute用户提供的命令作为subset调用的第二个参数。这就是bquote的业务所做的事情。 bquote接受一个命令,并引用它,使其不被R评估,而是存储为已解析的命令。关于bquote的特殊部分是它会评估.()内部的部分,因此substitute可以完成其工作。

一旦我们将子集表达式替换为用户表达式,我们就可以对其进行评估。