我想删除 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/