从R中的嵌套列表中删除空值

时间:2019-07-08 11:38:17

标签: r list dataframe null

我有一个嵌套的数据帧列表。在那些数据帧中,我有NA变量(现在是矢量?)。我要删除这些元素。

编辑:实际上我有NULL而不是NA。

df.ls <- list(list(id = NULL, x = 3, works = NULL),
                 list(id = 2, x = 4, works = NULL),
              NULL)

我尝试了这段代码,但是不知道如何判断应该使用哪个级别。

df.ls[sapply(df.ls, is.null)] <- NULL

3 个答案:

答案 0 :(得分:2)

对于NULL值,我们可以做到

l1 <- lapply(df.ls, function(x) x[lengths(x) > 0])

我们可以NA完成

l1 <- lapply(df.ls, function(x) x[!is.na(x)])
l1

#[[1]]
#[[1]]$x
#[1] 3


#[[2]]
#[[2]]$id
#[1] 2

#[[2]]$x
#[1] 4


#[[3]]
#list()

如果要删除空白列表,可以执行

l1[lengths(l1) >  0]

答案 1 :(得分:1)

我不确定您要做什么,因为您说您有一个data.frames列表,但是您提供的示例只是一个元素长度为1的列表的列表。

让我们假设您有一个data.frames列表,其中依次包含长度大于1的向量,并且您想删除所有“仅”包含NA的列。

df.ls <- list(data.frame(id = c(NA,NA,NA),
                         x = c(NA,3,5),
                         works = c(4,5,NA)),
              data.frame(id = c("a","b","c"),
                         x = c(NA,3,5),
                         works = c(NA,NA,NA)),
              data.frame(id = c("e","d",NA),
                         x = c(NA,3,5),
                         works = c(4,5,NA)))



>   [[1]]
      id  x works
    1 NA NA     4
    2 NA  3     5
    3 NA  5    NA

    [[2]]
      id  x works
    1  a NA    NA
    2  b  3    NA
    3  c  5    NA

    [[3]]
        id  x works
    1    e NA     4
    2    d  3     5
    3 <NA>  5    NA

然后这种方法将起作用:

    library(dplyr)
    library(purrr)
    non_empty_col <- function(x) {
        sum(is.na(x)) != length(x)
    }

    map(df.ls, ~ .x %>% select_if(non_empty_col))

哪个返回的data.frames列表不包含仅包含NA的列。

[[1]]
   x works
1 NA     4
2  3     5
3  5    NA

[[2]]
  id  x
1  a NA
2  b  3
3  c  5

[[3]]
    id  x works
1    e NA     4
2    d  3     5
3 <NA>  5    NA

但是,如果您希望列表在每个data.frame中仅包含完整的案例(没有NA的行),那么以下代码将起作用。

library(dplyr)
map(df.ls, ~ .x[complete.cases(.x), ])

就我的示例数据而言,只剩下data.frame 3的第2行。

答案 2 :(得分:0)

要删除NULL

discard(map(df.ls, ~ discard(.x, is.null)), is.null)
#[[1]]
#[[1]]$x
#[1] 3


#[[2]]
#[[2]]$id
#[1] 2

#[[2]]$x
#[1] 4

或者在base R中与Filteris.null

Filter(Negate(is.null), lapply(df.ls, function(x) Filter(Negate(is.null), x)))

OP更新之前的早期版本

library(purrr)
map(df.ls, ~ .x[!is.na(.x)])
#[[1]]
#[[1]]$x
#[1] 3


#[[2]]
#[[2]]$id
#[1] 2

#[[2]]$x
#[1] 4


#[[3]]
#list()