DATA
foo <- dplyr::tibble(a=c("a","b",NA),b=c("a","b","c"),colC=NA)
bar <- dplyr::tibble(a=c("a","b",NA),b=c("a","b","c"),colC=NA)
all_tibbles <- c("foo","bar")
lapply(mget(all_list), function(y) sapply(y, function(x) all(is.na(x))))
$foo # A tibble: 3 x 3 a b colC <chr> <chr> <lgl> 1 a a NA 2 b b NA 3 NA c NA $bar # A tibble: 3 x 3 a b colC <chr> <chr> <lgl> 1 a a NA 2 b b NA 3 NA c NA
我想从mget(all_list)
中的每个数据框中删除所有列 这将使用基本应用函数创建逻辑向量。
lapply(mget(all_tibbles), function(y) sapply(y, function(x) all(is.na(x))))
然后删除所有缺失值最少的行
lapply(mget(all_tibbles),function(x)
x[-which.min(rowSums((!is.na(x)))),])
然后将它们存储回相同的变量 foo 和 bar 中。顺便说一句,我有一个带有 tibble 名称的大字符向量。 我可以使用整洁的软件包来简化事情吗?基本函数相当复杂,我试图避免 for 循环
一个选项是select_if
library(dplyr)
library(purrr)
library(stringr)
out <- mget(all_tibbles) %>%
map(~ .x %>%
select_if(~ any(!is.na(.))))
out
#$foo
# A tibble: 3 x 2
# a b
# <chr> <chr>
#1 a a
#2 b b
#3 <NA> c
#$bar
# A tibble: 3 x 2
# a b
# <chr> <chr>
#1 a a
#2 b b
#3 <NA> c
names(out) <- str_c(names(out), "_edited")
如果我们需要更新"foo","bar"(不推荐(
list2env(out, .GlobalEnv)
或使用keep
mget(all_tibbles) %>%
map(~ keep(.x, colSums(!is.na(.)) > 0))
对于第二种带有行的情况
out1 <- mget(all_tibbles) %>%
map(~ .x %>%
slice(-which.min(rowSums(!is.na(.)))))
names(out2) <- str_c(names(out), "_edited2")
list2env(out2, .GlobalEnv)
或者我们可以使用base R
中的Filter
来删除列(OP 已经显示了用于删除行的基本 R 选项(
lapply(mget(all_tibbles), function(x)
Filter(function(y) any(!is.na(y)), x))