[英]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.