12

リスト階層 (JSON と同様) をマトリックスまたはデータ フレームにフラット化したいと考えています。次のリストを作成するとします。

a <- list(
  b1 = list(
     c1 = list(
       d1 = data.frame()
     ),
     c2 = data.frame()
  ),
  b2 = data.frame()
)

各文字が別のレベルであるか、階層を下ります。listToMatrix(mylist = a, steps = 2)次に、次を生成する関数が必要です。

    [,1] [,2]
[1,] "b1" "c1"
[2,] "b1" "c2"
[3,] "b2" "b2"

関数の引数steps = 2が、階層を 2 ステップだけ下に移動する必要があることを示していることに注意してください。また、一方向で使用できるレベルが十分でない場合 (「 」を参照b2)、マトリックス内の以前のリスト名を保持する必要があります。

助言がありますか?:)

4

1 に答える 1

9

これが解決策です。ここでは読みやすいので、コードを 2 つの部分に分けました。後で、2 つの部分を 1 つの関数に簡単にマージできます。

まず、再帰を使用してすべての名前の行列を取得する関数:

anames <- function(x) {

   require(plyr)
   if (is.data.frame(x)) return(NA)

   y <- do.call(rbind.fill.matrix,
                mapply(cbind, names(x), lapply(x, anames),
                       SIMPLIFY = FALSE))
   colnames(y) <- NULL

   return(y)
}

anames(a)
#      [,1] [,2] [,3] [,4]
# [1,] "b1" "c1" "d1" NA  
# [2,] "b1" "c2" NA   NA  
# [3,] "b2" NA   NA   NA

次に、指定された入力を適用し、要求したようstepsに s を埋める関数:NA

listToMatrix <- function(myList, steps = Inf) {

   a <- anames(myList)
   steps <- min(steps, ncol(a) - 1)
   cols.idx <- seq_len(steps)
   a <- a[, cols.idx]
   for (j in tail(cols.idx, -1))
      a[, j] <- ifelse(is.na(a[, j]), a[, j - 1], a[, j])

   return(a)
}

listToMatrix(a, 2)
#      [,1] [,2]
# [1,] "b1" "c1"
# [2,] "b1" "c2"
# [3,] "b2" "b2"
于 2012-10-07T12:22:02.710 に答える