我想删除所有具有零或NA的行。在下面的代码中,我选择数字变量,然后滤除0。问题在于它在最终输出中没有返回字符变量和数字变量。
df <- read.table(header = TRUE, text =
"x y z
a 1 2
b 0 3
c 1 NA
d 0 NA
")
df %>% select_if(is.numeric) %>% filter(rowSums(., na.rm = T)!=0)
答案 0 :(得分:2)
您可以使用filter_if
:
library(dplyr)
df %>% filter_if(is.numeric, any_vars(. != 0 & !is.na(.)))
# x y z
#1 a 1 2
#2 b 0 3
#3 c 1 NA
或使用基数R:
cols <- sapply(df, is.numeric)
df[rowSums(!is.na(df[cols]) & df[cols] != 0) > 0, ]
答案 1 :(得分:2)
另一个dplyr
选项可能是:
df %>%
rowwise() %>%
filter(any(across(where(is.numeric)) != 0, na.rm = TRUE))
x y z
<fct> <int> <int>
1 a 1 2
2 b 0 3
3 c 1 NA
答案 2 :(得分:0)
按照dplyr
版本1.0.0
发行后在此新doc page中编写的建议,您可以创建一个辅助函数来替代被取代的函数filter_if
和{{ 1}}。
以前,
any_vars
与filter()
和all_vars()
配对 帮手。现在,any_vars()
等效于across()
,并且没有 直接替换all_vars()
。但是你可以做一个简单的 自己帮忙
从现在开始,这种方式应该成为这种过滤步骤的参考方法。
any_vars()
答案 3 :(得分:0)
您可以简单地
df[rowSums(suppressWarnings(sapply(df, as.double)), na.rm=TRUE) > 0, ]
# x y z
# 1 a 1 2
# 2 b 0 3
# 3 c 1 NA