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

すべての関数呼び出しで最初の条件を使用して、以下に示すサブセットを実行できるようにしたいと考えています。2 番目の条件は、関数呼び出しごとに変更できるものです。さらに、2 番目のサブセット条件は、他の変数にある可能性があります (節約のために単一の変数 を使用しています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

デフォルトの 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 に答える
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 に答える