我计划在一行中过滤多列的数据,以减少运行代码所用的时间。这是我用来测试代码的示例数据。基本上,我想删除包含 0、1、2 和 NA 的任何行。
test <- data.frame(A = c(1,0,2,3,4,0,5,6,0,7,0,8,0,9,NA),
B = c(0,1,0,2,3,4,0,5,0,7,8,0,NA,9,0),
C = c(1,2,3,0,0,4,5,6,0,7,0,8,NA,0,9))
Run Code Online (Sandbox Code Playgroud)
我使用以下代码来清理我的数据。虽然它完成了工作,但代码非常乏味,当我使用大型数据库运行它时,需要花费相当长的时间。
test %>% filter(!is.na(A)) %>%
filter(!is.na(B)) %>%
filter(!is.na(C)) %>%
filter(A != 0) %>%
filter(A != 1) %>%
filter(A != 2) %>%
filter(B != 0) %>%
filter(B != 1) %>%
filter(B != 2) %>%
filter(C != 0) %>%
filter(C != 1) %>%
filter(C != 2)
A B C
1 6 5 6
2 7 7 7
Run Code Online (Sandbox Code Playgroud)
filter我尝试使用、filter_at、 和来缩短代码any_vars,但没有成功。下面是我处理这个问题的尝试(所有这些代码都不起作用,因为它们无法删除包含 0 (或 1,2 和 NA)的行。
df_total <- test %>%
filter_at(vars(A, B, C), any_vars(!is.na(.))) %>%
filter_at(vars(A, B, C), any_vars(. != 2)) %>%
filter_at(vars(A, B, C), any_vars(. != 1)) %>%
filter_at(vars(A, B, C), any_vars(. != 0))
df_total <- test %>%
filter_at(vars(A, B, C), any_vars(!is.na(.) | . != 2 | . != 1 | . != 0))
df_total <- test %>%
filter(!is.na(A) | A!= 2 | A!= 1 | A!= 0) %>%
filter(!is.na(B) | B!= 2 | B!= 1 | B!= 0) %>%
filter(!is.na(C) | C!= 2 | C!= 1 | C!= 0) %>%
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚我在这里做错了什么。为了解决这个问题,我在文档和R之间来回奔波,但我的努力毫无用处。您能否向我建议我在代码中做错了什么?如何在一行中编写具有多个条件的多列代码?一行的目的是加快 R 的运行时间。任何找到答案的建议/建议/资源将不胜感激!谢谢。
另一种可能的解决方案:
library(dplyr)
test %>%
filter(complete.cases(.) & if_all(everything(), ~ !(.x %in% 0:2)))
#> A B C
#> 1 6 5 6
#> 2 7 7 7
Run Code Online (Sandbox Code Playgroud)