我在一个看似简单的任务中遇到了一些问题:使用dplyr删除all个变量为NA的所有行.我知道可以使用base R(Remove rows in R matrix where all data is NARemoving 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)

但这看起来不太好,尽管它完成了任务.还有其他 idea 吗?

推荐答案

由于dplyr 0.7.0是新的,所以存在范围过滤谓词.使用filter_any,您可以轻松筛选至少有一个非缺失列的行:

# dplyr 0.7.0
dat %>% filter_all(any_vars(!is.na(.)))

使用@hejseb基准测试算法,该解决方案似乎与f4一样高效.

UPDATE:

自dplyr 1.0.0以来,上述范围动词被取代.相反,引入了跨函数族,它允许在多个(或所有)列上执行一个函数.筛选至少有一列不为NA的行现在看起来如下所示:

# dplyr 1.0.0
dat %>% filter(if_any(everything(), ~ !is.na(.)))

R相关问答推荐

NA仅省略具有NA的 Select 行

使用列表列作为case_when LHS的输入

基于2行删除重复项指定每列要执行的操作

更改网格的crs以匹配简单要素点对象的crs

如何创建构成多个独立列条目列表的收件箱框列?

Highcharter多次钻取不起作用,使用不同方法

derrr summarise每个组返回多行?

用相同方法得到不同函数的ROC最优截断值

筛选出以特定顺序患病的个体

迭代通过1个长度的字符串长字符R

如何计算多个日期是否在一个日期范围内

如何使用列表中多个列表中的第一条记录创建数据框

使用列/行匹配将两个不同维度的矩阵相加

计算满足R中条件的连续列

如何将使用rhandsontable呈现的表值格式化为百分比,同时保留并显示完整的小数精度?

将多个列值转换为二进制

在R中使用列表(作为tibble列)进行向量化?

层次树图的数据树

ArrangeGrob()和类似的替代方法不接受Grob列表.在Grid.Draw,返回:glist中的错误(...):仅允许在glist";中使用Grobs;

将数据从一列转换为按组累计计数的单个虚拟变量