R 将表达式连接到数据帧的子集
我正在尝试创建一个函数,该函数将计算子集数据帧中某列的平均值。这里的诀窍是,我总是希望有几个子集条件,然后可以选择将更多条件传递给函数以进一步子集数据帧 假设我的数据如下所示:R 将表达式连接到数据帧的子集,r,subset,R,Subset,我正在尝试创建一个函数,该函数将计算子集数据帧中某列的平均值。这里的诀窍是,我总是希望有几个子集条件,然后可以选择将更多条件传递给函数以进一步子集数据帧 假设我的数据如下所示: dat <- data.frame(var1 = rep(letters, 26), var2 = rep(letters, each = 26), var3 = runif(26^2)) head(dat) var1 var2 var3 1 a a 0.7506109 2 b
dat <- data.frame(var1 = rep(letters, 26), var2 = rep(letters, each = 26), var3 = runif(26^2))
head(dat)
var1 var2 var3
1 a a 0.7506109
2 b a 0.7763748
3 c a 0.6014976
4 d a 0.6229010
5 e a 0.5648263
6 f a 0.5184999
我的示例函数和函数调用如下所示:
getMean <- function(expr) {
return(with(subset(dat, var1 %in% c('a', 'b', 'c') eval(expr)), mean(var3)))
}
getMean(expression(& var2 %in% c('a', 'b')))
getMean(10))
非常感谢您的帮助
编辑:在Wojciech Sobala的帮助下,我想出了以下函数,它让我可以选择传递0个或更多条件
getMean <- function(expr = NULL) {
sub <- if(is.null(expr)) { expression(var1 %in% c('a', 'b', 'c'))
} else expression(var1 %in% c('a', 'b', 'c') & eval(expr))
return(with(subset(dat, eval(sub)), mean(var3)))
}
getMean()
getMean(expression(var2 %in% c('a', 'b')))
getMean这就是我的方法。函数getMean利用R的便捷默认参数设置:
getMean <- function(x, subset_var1, subset_var2=unique(x$var2)){
xs <- subset(x, x$var1 %in% subset_var1 & x$var2 %in% subset_var2)
mean(xs$var3)
}
getMean(dat, c('a', 'b', 'c'))
[1] 0.4762141
getMean(dat, c('a', 'b', 'c'), c('a', 'b'))
[1] 0.3814149
getMean可以使用defalut expr=TRUE来简化它
getMean <- function(expr = TRUE) {
return(with(subset(dat, var1 %in% c('a', 'b', 'c') & eval(expr)), mean(var3)))
}
getMean谢谢你的回答。我在我的第一篇文章中不够清楚,所以我对它进行了编辑,其中包括可以以各种方式对多个变量进行子集设置。我不确定我需要如何对数据进行子集,因此该函数需要足够灵活,以处理%
中的%以外的其他方式。您应该在子集函数子集(dat,var1%in%c('a','b','c')和eval(expr))中进行小的更改(添加&),然后调用getMean(expression)(var2%in%c('a','b'))。太好了,可以了。你想让你的回答成为我可以接受的答案吗?如果你要使用表达式,我认为你最好在你自己的函数中复制子集的逻辑-你当前的尝试将创建非常难以修复的bug。谢谢,哈德利。我不清楚为什么会这样。你能指出吗让我做一些可以解释为什么或者如何做的事情?
getMean <- function(x, subset_var1, subset_var2=unique(x$var2)){
xs <- subset(x, x$var1 %in% subset_var1 & x$var2 %in% subset_var2)
mean(xs$var3)
}
getMean(dat, c('a', 'b', 'c'))
[1] 0.4762141
getMean(dat, c('a', 'b', 'c'), c('a', 'b'))
[1] 0.3814149
getMean <- function(expr = TRUE) {
return(with(subset(dat, var1 %in% c('a', 'b', 'c') & eval(expr)), mean(var3)))
}