Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将表达式连接到数据帧的子集_R_Subset - Fatal编程技术网

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)))
}