假设我们有一个嵌套列表:
test <- list(
list(a = 1, b = 2, c = NULL),
list(a = NULL, b = 2, c = 3))
如何使用NULL
替换所有NA
值以保留数据结构?因此,当我尝试将数据框从列表中删除时,我最终不会丢失值/结构。如:
data.frame(matrix(unlist(test), nrow = 2, byrow = T))
X1 X2
1 1 2
2 2 3
所需的输出类似于:
X1 X2 X3
1 1 2 NA
2 NA 2 3
有建议这样做:
rbind.fill(lapply(test, function(f) {
as.data.frame(Filter(Negate(is.null), f))
}))
这不像我想的那样矢量化。显然尺寸和性能是一个问题。弹出的一种解决方法是替换所有NULL值,就像一次完成整个数据帧一样。然后是unlist()
和matrix()
列表。
我不确定性能的好坏(如果有的话)。也许好老lapply()
并不是那么糟糕。
答案 0 :(得分: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
这可以转换为data.frame
as.data.frame(m1)
答案 1 :(得分:2)
在找到here的答案之后,这里有一种(有点扭曲的)方式进入base R
:
data.frame(matrix(as.numeric(as.character(unlist(test, recursive=F))), nrow=length(test), byrow=T))
# X1 X2 X3
#1 1 2 NA
#2 NA 2 3
答案 2 :(得分:1)
如果你知道它只是一个两级列表,你可以使用两个循环测试is.null
来遍历每个元素。
test <- list(
list(a = 1, b = 2, c = NULL),
list(a = NULL, b = 2, c = 3)
)
# get structure fyi
str(test)
# tells you the highest level list length
length(test)
for(i in 1:length(test))
for(j in 1:length(test[[i]])) # second level
if(is.null(test[[i]][[j]])) test[[i]][[j]]<-NA
编辑:那么当然要做你以前做的事情。
答案 3 :(得分:0)
通过dput
和dget
以及剪贴板采用不同的方法。
test <- list(
list(a = 1, b = 2, c = NULL),
list(a = NULL, b = 2, c = 3))
dput(test,file="clipboard-1024")
tmp=dget(textConnection(gsub("NULL","NA",readChar(con="clipboard-1024",file.info("clipboard-1024")$size))))
data.frame(matrix(unlist(tmp), nrow = 2, byrow = T))
# X1 X2 X3
#1 1 2 NA
#2 NA 2 3
我不知道这有多快或多慢。