使用存储在列表中的数据框名称在数据框列表的每一列和每一行上执行多种功能

时间:2019-12-27 20:55:46

标签: r dataframe dplyr tibble

数据

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循环

1 个答案:

答案 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}}