我计划使用一行代码来过滤多个列中的数据,以减少运行代码所需的时间。以下是我用于测试代码的示例数据。基本上,我想要删除任何包含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))
我用以下代码清理数据。尽管它完成了任务,但这段代码非常繁琐,在运行大型数据库时需要花费相当长的时间。
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
我试图使用 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) %>%
我在这里弄不清楚我的错误出在哪里。我一直在文档和R之间反复寻找解决方法,但我的努力都是无用的。您能否建议我在代码中做错了什么?如何在一行代码中为多个列编写具有多个条件的代码?一行代码的目的是加快R的运行速度。任何建议/建议/资源都将不胜感激!谢谢。
test %>% filter(complete.cases(.[c("A", "B", "C")]) & if_all(c(A, B, C), ~ !(.x %in% 0:2)))
- PaulSfilter(A != 0) %>% filter(A != 1) %>% filter(A != 2)
,您的意思是删除所有包含0或1或2的行。因此,可以将其转换为filter(!A %in% 0:2)
。由于还必须满足列B和C的这个条件,因此需要一个“and”:filter((!A %in% 0:2) & (!B %in% 0:2) & (!C %in% 0:2))
。 - PaulS