R:替换嵌套列表中的值

R:替换嵌套列表中的值,r,R,假设我们有一个嵌套列表: test <- list( list(a = 1, b = 2, c = NULL), list(a = NULL, b = 2, c = 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)) })) 这并不像我想要的那样

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

test <- list(
  list(a = 1, b = 2, c = NULL),
  list(a = NULL, b = 2, c = 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))
}))
这并不像我想要的那样矢量化。显然,尺寸和性能是一个问题。想到的一个解决方法是替换所有空值,就像一次可以对整个数据帧进行替换一样。然后
unlist()
matrix()
列表


我不确定这次演出有什么收获(如果有的话)。也许好的旧
lappy()
并没有那么糟糕。

我们可以使用
stri\u 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

如果您知道它只是一个两级列表,那么您可以使用两个循环测试
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
test在找到以下答案后,这里有一个(有点扭曲的)方法进入
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

通过
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

测试只是好奇-是否有替换值的选项,而不是应用类似循环的函数?还有其他选项,如
rbind.all
data.table
包中。。。它确实达到了预期的效果,但路线并不是我所期望的。在对不同情况进行了一些测试之后,这似乎是最普遍的方法。@A.Val。您是否尝试过使用此方法和
rbindlist
的一些基准测试,如果我的嵌套列表具有混合的向量类型,这是否仍然有效?(我的列表中有替身、字符和列表…@MagO不知道结构,很难说。你可以发布一个新的questionLoop吗?这是一个显而易见的答案,我想不惜一切代价避免,也许我应该扩展我的问题来澄清一下。要替换整个列表中的空值,我们必须访问其中的元素。使用
data.table 1.9.5
您可以在更新的代码中使用
rbindlist(lappy(..),fill=TRUE)
,这需要lappy,基本上与原始答案的性能相同?我还没有检查基准,但我认为rbindlist会更快。@ColonelBeauvel,谢谢,虽然我在这里唯一的功劳就是找到了正确的SO页面;-)
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
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