假设我们有一个嵌套列表:
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()不是那么糟糕.
我们可以用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)