R:替换嵌套列表中的值

sta*_*ace 8 r

假设我们有一个嵌套列表:

test <- list(
  list(a = 1, b = 2, c = NULL),
  list(a = NULL, b = 2, c = 3))
Run Code Online (Sandbox Code Playgroud)

如何替换所有NULL值,比如NA保留数据结构?因此,当我尝试将数据框从列表中删除时,我最终不会丢失值/结构.如:

data.frame(matrix(unlist(test), nrow = 2, byrow = T))

  X1 X2
1  1  2
2  2  3
Run Code Online (Sandbox Code Playgroud)

期望的输出是这样的:

   X1 X2 X3
1  1  2  NA
2  NA 2  3
Run Code Online (Sandbox Code Playgroud)

有建议这样做:

rbind.fill(lapply(test, function(f) {
  as.data.frame(Filter(Negate(is.null), f))
}))
Run Code Online (Sandbox Code Playgroud)

这不像我想的那样矢量化.显然尺寸和性能是一个问题.弹出的一个解决方法是替换所有NULL值,就像一次完成整个数据帧一样.然后unlist()matrix()列表.

我不确定性能的好坏(如果有的话).也许好老lapply()不是那么糟糕.

akr*_*run 4

我们可以用stri_list2matrix

library(stringi)
m1 <- matrix(as.numeric(t(sapply(test, stri_list2matrix))), ncol=3)
m1
#    [,1] [,2] [,3]
#[1,]    1    2   NA
#[2,]   NA    2    3
Run Code Online (Sandbox Code Playgroud)

这可以转换为data.frame

as.data.frame(m1)
Run Code Online (Sandbox Code Playgroud)