R:替换嵌套列表中的值

时间:2015-04-03 07:18:30

标签: r

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

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()并不是那么糟糕。

4 个答案:

答案 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)

通过dputdget以及剪贴板采用不同的方法。

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

我不知道这有多快或多慢。