我有一个嵌套的数据帧列表。在那些数据帧中,我有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
答案 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
中与Filter
和is.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()