1

私の質問のタイトルは、「ネストされた」部分を除いて、 dlply(パッケージ) の説明とほぼ一致しています。plyr

例を挙げて説明しましょう:

library(plyr)
res <- dlply(mtcars, c("gear", "carb"), identity)
head(res, 2)
# $`3.1`
#                 mpg cyl  disp  hp drat    wt  qsec vs am gear carb
# Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
# Valiant        18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
# Toyota Corona  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
# 
# $`3.2`
#                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
# Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
# Dodge Challenger  15.5   8  318 150 2.76 3.520 16.87  0  0    3    2
# AMC Javelin       15.2   8  304 150 3.15 3.435 17.30  0  0    3    2
# Pontiac Firebird  19.2   8  400 175 3.08 3.845 17.05  0  0    3    2

ご覧のとおり、出力は、名前 (キー) がデータの分割に使用した 2 つの変数の連結であるリストです。たとえば、"3.1"は のキーです(gear = 3, carb = 1)

代わりに、分割変数ごとに 1 つずつ、2 セットのキーを介して要素にアクセスできるように、結果をネストされたリストにしたいと考えていますres[["3"][["1"]]

必ずしもplyrパッケージからではなく、これを達成できる何かがありますか? 答えを任意の数の分割変数に一般化できるようにしたいと思います。また、私の例では関数を使用していましたが、任意の関数を適用できることが重要でありidentity、結果としてデータが分割されただけです。ご提案いただきありがとうございます。

4

2 に答える 2

3

私は自分で解決策を思いつきました.それは再帰を使用しています:

nested.dlply <- function(df, by, fun, ...) {

   require(plyr)

   if (length(by) == 1) {
      dlply(df, by, fun, ...)
   } else {
      dlply(df, by[1], nested.dlply, by[-1], fun, ...)
   }
}

以下にいくつかの例を示します。

nested.dlply(mtcars, c("gear", "carb"), identity)
# $`3`
# $`3`$`1`
#                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
# Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
# Valiant        18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
# Toyota Corona  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
# 
# $`3`$`2`
#                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
# Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
# Dodge Challenger  15.5   8  318 150 2.76 3.520 16.87  0  0    3    2
# AMC Javelin       15.2   8  304 150 3.15 3.435 17.30  0  0    3    2
# Pontiac Firebird  19.2   8  400 175 3.08 3.845 17.05  0  0    3    2
# [...]

nested.dlply(mtcars, c("gear", "carb"), head, 2)
# $`3`
# $`3`$`1`
#                 mpg cyl disp  hp drat    wt  qsec vs am gear carb
# Hornet 4 Drive 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
# Valiant        18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
# 
# $`3`$`2`
#                    mpg cyl disp  hp drat   wt  qsec vs am gear carb
# Hornet Sportabout 18.7   8  360 175 3.15 3.44 17.02  0  0    3    2
# Dodge Challenger  15.5   8  318 150 2.76 3.52 16.87  0  0    3    2
# [...]

これが非常に効率的であるとは思えませんが、仕事はします。私はまだあなたの提案を歓迎します. 理想的には、いくつかのパッケージがすでに実装されていることを望んでいました。

于 2012-07-18T12:30:26.607 に答える
2

ネスティングはsplitどうですか?

temp = lapply(split(mtcars, mtcars$gear), function(x) split(x, x$carb))
temp[["3"]]["1"]
# $`1`
#                 mpg cyl  disp  hp drat    wt  qsec vs am gear carb
# Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
# Valiant        18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
# Toyota Corona  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
于 2012-07-18T11:02:50.137 に答える