2

我正在尝试创建一个函数来计算子集数据框中列的平均值。这里的技巧是我总是想要有几个子集条件,然后可以选择将更多条件传递给函数以进一步子集数据帧。

假设我的数据如下所示:

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

我希望能够使用所有函数调用中的第一个条件来完成下面显示的子集,而第二个条件可以随着每个函数调用而改变。此外,第二个子集条件可以在其他变量上(我使用单个变量 ,var2表示简约,但条件可能涉及多个变量)。

subset(dat, var1 %in% c('a', 'b', 'c') & var2 %in% c('a', 'b'))
   var1 var2      var3
1     a    a 0.7506109
2     b    a 0.7763748
3     c    a 0.6014976
27    a    b 0.7322357
28    b    b 0.4593551
29    c    b 0.2951004

我的示例函数和函数调用如下所示:

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(expression(& var4 < 6 & var5 > 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')))
4

2 回答 2

1

这就是我将如何处理它。函数 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
于 2011-04-03T17:50:14.513 回答
1

它可以用默认 expr=TRUE 来简化。

getMean <- function(expr = TRUE) {
  return(with(subset(dat, var1 %in% c('a', 'b', 'c') & eval(expr)), mean(var3)))
}
于 2011-04-04T19:39:26.177 回答