繁体   English   中英

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

[英]Filter dataframe for columns that contain data in R using tidyverse

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

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 行输入了数据的 rest。

我想要的是过滤对作者有NA的行,然后过滤任何列中的任何数据条目。 因此,对于上述示例,我预期的 output 将是:

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

我觉得我已经很接近了,但是经过几个小时的尝试和查看堆栈后,我的代码仍然向我返回空数据帧。 我更喜欢 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, )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM