数据
node -v
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))))
,然后将它们存储回相同的变量foo和bar中。我有一个大字符向量,标题名称为btw。 我可以使用tidyr包装来简化事情吗?基本功能相当复杂,并且正在尝试避免for循环
答案 0 :(得分:2)
一个选项是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")
list2env(out, .GlobalEnv)
如果我们需要更新“ foo”,“ bar”(不推荐)
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)
第二种有行的情况
Filter
或者我们可以使用base R
中的lapply(mget(all_tibbles), function(x)
Filter(function(y) any(!is.na(y)), x))
删除列(OP已经显示了用于删除行的基本R选项)
{{1}}