我有一个嵌套的数据帧列表。在这些数据框架中,我有NA变量(现在向量?(。我想删除这些元素。
编辑:实际上我有空而不是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
对于NULL
值,我们可以做
l1 <- lapply(df.ls, function(x) x[lengths(x) > 0])
对于NA
S,我们可以做
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]
我不确定您要做什么,因为您说您有一个data.frames列表。
假设您有一个data.frames的列表,又包含长度> 1的向量,并且要删除所有"仅"仅" NAS的列。
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列表。
[[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
但是,如果您希望您的列表在每个数据中仅具有完整的案例。帧(无NAS行(,则以下代码将起作用。
library(dplyr)
map(df.ls, ~ .x[complete.cases(.x), ])
在我的示例数据的情况下,让您仅使用数据的第2行。
删除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
或用Filter
和is.null
base R
中 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()