R将列表层次结构展平为矩阵或data.frame

rei*_*son 12 r list matrix

我想将列表层次结构(类似于JSON)展平为矩阵或数据框.假设我创建了以下列表:

a <- list(
  b1 = list(
     c1 = list(
       d1 = data.frame()
     ),
     c2 = data.frame()
  ),
  b2 = data.frame()
)
Run Code Online (Sandbox Code Playgroud)

每个字母是另一个级别或逐步降低层次结构.然后我想要一个函数,例如listToMatrix(mylist = a, steps = 2),生成以下内容:

    [,1] [,2]
[1,] "b1" "c1"
[2,] "b1" "c2"
[3,] "b2" "b2"
Run Code Online (Sandbox Code Playgroud)

观察到函数的论点steps = 2意味着它应该只在层次结构中向下走两步.此外,如果在一个方向上没有足够的可用级别,请参阅b2,然后它应该将前一个列表名称保留在矩阵中.

有什么建议?:)

flo*_*del 8

这是一个解决方案.所以它在这里很容易阅读,我把代码分成了两部分.之后,您可以轻松地将这两个部分合并为一个功能.

首先,使用递归获取所有名称的矩阵的函数:

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
Run Code Online (Sandbox Code Playgroud)

然后,一个应用给定steps输入的函数,并按照NA您的请求填充s:

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"
Run Code Online (Sandbox Code Playgroud)