使用 tidyverse 过滤包含 R 中数据的列的数据框

Filter dataframe for columns that contain data in R using tidyverse

我正在尝试编写一行简单的代码来检测数据帧中哪里有不正确的条目。 考虑以下示例:

author   val1   val2   val3   val4
A         1      B      1      NA
A         NA     NA     NA     NA
NA        2      B      NA     B
NA        NA     NA     NA     B
NA        NA     NA     NA     NA
A         2      A      NA     B

一行总是需要填写作者,但有时会忘记这一点。此外,有时第 2 行填写了作者,但不小心将其余数据输入到第 3 行。

我想要的是过滤作者 NA 的行,然后过滤任何列中的任何数据条目。所以我对上面例子的预期输出是:

author   val1   val2   val3   val4
NA        2      B      NA     B
NA        NA     NA     NA     B

为作者过滤带有 NA 的行很容易,但我不知道下一步该做什么。到目前为止我的代码:

 df %>%
  filter(
    is.na(author)
    ) %>%  
  filter(
    across(
      .cols = everything(),
      .fns = ~ !is.na(.x)
    )
  ) 

我觉得我已经很接近了,但是经过几个小时的尝试和查看堆栈后,我的代码仍然 returns 对我来说是空数据帧。我更喜欢 tidyverse 语法的解决方案,但非常感谢任何帮助。

我的代码不是很有效,但它似乎可以工作。

library(stringr)
library(rebus)
library(tidyverse)
library(magrittr)

df <- tibble(author = c('A', 'A', NA, NA, NA, 'A'),
             val1   = c(1, NA, 2, NA, NA, 2),
             val2   = c('B', NA, 'B', NA, NA, 'A'),
             val3   = c(1, NA, NA, NA, NA , NA),
             val4   = c(NA, NA, 'B', 'B', NA, 'B'))

df_na <- filter(df, is.na(author)) 

#map and str_which will cover each column

index <- map(df_na,~ str_which(.x, pattern = rebus::or(ANY_CHAR, DGT))) %>% 
    keep(~ length(.x) != 0) %>% #filter any columns that are all NA
    unlist() %>%
    unique()

df_na %>% extract(index, )