【发布时间】:2017-05-27 08:49:19
【问题描述】:
我在执行一项看似简单的任务时遇到了一些问题:使用 dplyr 删除 all 变量为 NA 的所有行。我知道可以使用 base R(Remove rows in R matrix where all data is NA 和 Removing empty rows of a data file in R)来完成,但我很想知道是否有使用 dplyr 的简单方法。
例子:
library(tidyverse)
dat <- tibble(a = c(1, 2, NA), b = c(1, NA, NA), c = c(2, NA, NA))
filter(dat, !is.na(a) | !is.na(b) | !is.na(c))
上面的filter 调用可以满足我的需求,但在我面临的情况下它是不可行的(因为存在大量变量)。我想可以通过使用filter_ 并首先使用(长)逻辑语句创建一个字符串来做到这一点,但似乎应该有一种更简单的方法。
另一种方法是使用rowwise()和do():
na <- dat %>%
rowwise() %>%
do(tibble(na = !all(is.na(.)))) %>%
.$na
filter(dat, na)
但这看起来不太好,尽管它完成了工作。其他想法?
【问题讨论】:
-
可以
dat %>% filter(rowSums(is.na(.)) != ncol(.))或者dat %>% filter(rowMeans(is.na(.)) < 1) -
或
dat %>% filter(Reduce(`+`, lapply(., is.na)) != ncol(.)),它们基本上都是基本R结合filter的实现。我认为tidyverse中没有内置任何东西可以非常有效地做到这一点 -
不过,Hadley 可能会建议使用长格式,例如
dat %>% mutate(indx = row_number()) %>% gather(var, val, -indx) %>% group_by(indx) %>% filter(sum(is.na(val)) != n()) %>% spread(var, val) -
@DavidArenburg 谢谢,这些都是不错的建议!我感觉会有某种
all函数,比如filter(dat, !all_na()),但我猜不会。 -
如果还没有,说不定哪天会有。