删除只有零的行

时间:2020-07-03 07:26:09

标签: r filter dplyr

我想删除所有具有零或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)

4 个答案:

答案 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_varsfilter()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