2

ddply()定義された最も詳細なグループだけでなく、それらのサブグループのグループの出力を取得するために使用する雄弁な方法はありますか?

つまり、分類子の1つが「任意」、「どちらか」、「関係ない」の場合です。ddply2つのグループ化変数の単純なケースでは、これは;への個別の呼び出しによって実現できます。ただし、すべて「any」に設定できる3つ以上の分類子がある場合ddply、「any」+その他の新しい組み合わせごとに何度も実行する必要があるため、これは厄介になります。

再現可能な例:

require(plyr)

## create a data frame with three classification variables
## and two numeric variables:
df1=data.frame(classifier1 = LETTERS[sample(2,200,replace=T)],
classifier2 = letters[sample(3,200,replace=T)],
classifier3 = rep(c("foo","bar"),100),
VAR1 = runif(200,50,250),
VAR2 = rnorm(200,85,20))

## apply an arbitrary function to subsets of df1; that is, all unique
## combinations of the three classifiers.
dlply(df1, .(classifier1,classifier2,classifier3),
      function(df) lm(VAR1 ~ VAR2, data=df))

$A.a.bar

Call:
lm(formula = VAR1 ~ VAR2, data = df)

Coefficients:
(Intercept)         VAR2  
   230.5555      -0.8591  


$A.a.foo

Call:
lm(formula = VAR1 ~ VAR2, data = df)

Coefficients:
(Intercept)         VAR2  
   128.3078       0.3631  

...

さて、いずれか/すべての分類子が含まれていないときに、さらにいくつかのグループで同じ出力を取得したい場合はどうなりますか。たとえば、when classifier1 = "any"を含めたい場合は、次のdlplyように、ステートメントにclassifier2とclassifier3のみを含めます。

dlply(df1, .(classifier2,classifier3), function(df) lm(VAR1 ~ VAR2, data=df))

次に、classifier2とclassifier3 = "any"の出力を取得したい場合は、ddply呼び出しから再度削除し、classifier1のみを含めます。

dlply(df1, .(classifier1), function(df) lm(VAR1 ~ VAR2, data=df))

ただし、3つよりも多くの分類子がある場合、これは扱いにくくなり、各分類子を取り出すことができます(つまり、= "any")-組み合わせの数が大幅に増加します。データのすべての「グループのグループ」の出力を取得するための雄弁で高速な方法はありますか?

4

1 に答える 1

4

1つのアプローチは、組み合わせのリストを作成してから、を使用して各呼び出しMapの結果のリストを作成することです。dlply

およびとcombn組み合わせて使用​​して、1,2、...、n変数のすべての組み合わせのリストを作成できます。lapplydo.call('c',...)

xx <- do.call('c',lapply(1:3, function(m) {
           combn(x=names(df1)[1:3],m, simplify = FALSE)}))

次に、これをへの呼び出しで使用できますMap(これはのラッパーですmapply(..., SIMPLIFY = FALSE)

results <- Map(f = function(x){dlply(df1,.var=x, .fun = lm, formula = VAR1 ~ VAR2)},xx)

combnまたは、関数を-に渡すこともできます。これは同じことを行います

results <-  do.call('c',lapply(1:3, function(m) {
  combn(x=names(df1)[1:3],m, simplify = FALSE, 
      function(vv) {dlply(df1,.var=vv, .fun = lm, formula = VAR1~VAR2)})
   }))
于 2013-03-25T02:15:29.110 に答える