r语言 - 使用存储在列表中的数据帧名称对数据帧列表的每一列和每一行执行多个功能



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))

最新更新