10

基本要素がデータ フレームであるネストされたリストがあり、このリストを再帰的に走査して各データ フレームの計算を行い、最終的に入力と同じ構造の結果のネストされたリストを取得します。「rapply」がまさにそのような種類のタスクであることは知っていますが、rapply は実際には必要以上に深くなるという問題に遭遇しました。つまり、すべてのデータ フレームを分解し、代わりに各列に適用します (データ フレーム自体がリストであるため)。 Rで)。

私が考えることができる1つの回避策は、各データフレームをマトリックスに変換することですが、データ型を統一することを強制するので、あまり好きではありません. rapply の再帰的な深さを制御する方法があるかどうか知りたいです。何か案が?ありがとう。

4

3 に答える 3

8

1. プロトでラップ

リスト構造を作成するときは、プロト オブジェクトでデータ フレームをラップしてみてください。

library(proto)
L <- list(a = proto(DF = BOD), b = proto(DF = BOD))
rapply(L, f = function(.) colSums(.$DF), how = "replace")

与える:

$a
  Time demand 
    22     89 

$b
  Time demand 
    22     89 

さらに進めたい場合は、関数の結果もプロトオブジェクトにラップしますrapply

f <- function(.) proto(result = colSums(.$DF))
out <- rapply(L, f = f, how = "replace")
str(out)

与える:

List of 2
 $ a:proto object 
 .. $ result: Named num [1:2] 22 89 
 ..  ..- attr(*, "names")= chr [1:2] "Time" "demand" 
 $ b:proto object 
 .. $ result: Named num [1:2] 22 89 
 ..  ..- attr(*, "names")= chr [1:2] "Time" "demand" 

2. 独自のラップリーの代替案を作成する

recurse <- function (L, f) {
    if (inherits(L, "data.frame")) f(L)
    else lapply(L, recurse, f)
}

L <- list(a = BOD, b = BOD)
recurse(L, colSums)

これは与える:

$a
  Time demand 
    22     89 

$b
  Time demand 
    22     89 

追加: 2 番目のアプローチ

于 2013-07-31T13:49:44.757 に答える