r - 如何使用 dbplyr 删除仅包含 NA 的所有列?

标签 r purrr dbplyr

我想删除 dbplyr 语法中仅包含 NA 值的数据帧的所有列。
使用普通的 R 语法这是没有问题的,请参见此处:Remove columns from dataframe where ALL values are NA
这是 R 中的一种可能性:

library(tidyverse)
library(DBI)
library(dbplyr)

df <- data.frame(a = NA,
                 b = seq(1:5), 
                 c = c(rep(1, 4), NA))

df %>% purrr::discard(~all(is.na(.)))
# desired output:
# A tibble: 5 × 2
      b     c
  <int> <dbl>
1     1     1
2     2     1
3     3     1
4     4     1
5     5    NA

但现在我想用 dbplyr 语法来执行此操作。为此,以下示例:

# Creating test database
con <- dbConnect(RSQLite::SQLite(), "")
# Inserting test table
dbWriteTable(con, "df", df)

con %>% 
  tbl("df") %>% 
  purrr::discard(~all(is.na(.))) %>% 
  collect()

#Error in UseMethod("collect") : 
# no applicable method for 'collect' applied to an object of class "list"

任何人都可以帮我在 dbplyr 中找到解决方案吗?

最佳答案

修订后的答案 - 删除每个值为 NA 的列

这里的想法是检查每列的 NA 数量并与行数进行比较:

df = con %>% tbl("df")

num_rows = df %>%
  ungroup() %>%
  summarise(num = n()) %>%
  collect() %>%
  pull(num)

cols_to_remove = c()

for(col in colnames(df)){
  num_na = df %>%
    ungroup() %>%
    mutate(is_na = ifelse(is.na(!!sym(col)), 1, 0)) %>%
    summarise(num_na = sum(is_na)) %>%
    collect() %>%
    pull(num_na)

  if(num_na == num_rows){
    cols_to_remove = c(cols_to_remove, col)
  }
}

local_df = df %>%
  select(-all_of(cols_to_remove)) %>%
  collect()

原始答案 - 删除每个值为 NA 的行

这是一种方法:

df = con %>% tbl("df")

df = df %>% mutate(all_na = TRUE)

for(col in colnames(df)){
  df = df %>%
    mutate(all_na = ifelse(!is.na(!!sym(col)), FALSE, all_na))
}

df %>%
  filter(all_na != TRUE) %>%
  select(-all_na)

这个想法是创建一个新列来存储是否在该行中找到 NA。通过迭代所有行并更新此列,我们为所有 NA 值的存在创建一个指示符列。


语法解释

!!sym(.) 是一个 rlang 功能。它将包含字符串 "my_column" 的变量 col 转换为列名 my_column

我们使用 all_of 来实现类似的目的,而不是在 select 中使用 !!sym(.)

关于r - 如何使用 dbplyr 删除仅包含 NA 的所有列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76613918/

相关文章:

r - 当有 n 个连续虚拟对象时进行子集化

r - 如何使用矢量长度不一致的 purrr::map2()

r - 在 R 中创建 GIF 时出现帧顺序问题(库 : "magick" and "purrr")

r - 将列添加到 sqlite 数据库

r - 编写自定义 R 函数以在 dbplyr SQL 中使用

r - R中的vi输入模式?

r - 在 ubuntu 上安装 ggplot2 包

r - 使用 tidyverse 获取 Nest 的描述性结果,然后计算我们有多少个观察结果符合这些标准

r - 使用 Dbplyr 时将日期转换为年季度格式

python - 为虚拟变量创建模型