我正在编写一个函数,允许某人将3个数据集传递给函数,然后根据大于/小于/等于数据集中的一个变量对合并数据集进行子集化。如下所示:
myfunc <- function(data1, data2, data3, subsetvariable, gle, criterion){
....
....
}
其中data1,2,3是数据集,subsetvariable类似于年龄或体重,标准类似于20年,145磅等。变量gle大于/小于/等于用户应该能够进入该功能。
在函数内部我会有:
data <- data[data$age > 30,]
简单地将年龄的子集变量和30的标准变量放入到位很容易,但是如何通过“&gt;”进入功能?
感谢您的帮助!
答案 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
可以完成其工作。
一旦我们将子集表达式替换为用户表达式,我们就可以对其进行评估。