当前位置: 首页 > 知识库问答 >
问题:

使用dplyr过滤data.frame中的完整案例(逐例删除)

傅志文
2023-03-14

是否可以使用 dplyr 筛选完整案例的数据帧?当然,包含所有变量列表的完整案例是有效的。但这是a)当有很多变量时很详细,b)当变量名称未知时是不可能的(例如,在处理任何data.frame的函数中)。

library(dplyr)
df = data.frame(
    x1 = c(1,2,3,NA),
    x2 = c(1,2,NA,5)
)

df %.%
  filter(complete.cases(x1,x2))

共有3个答案

李俊雅
2023-03-14

下面是Grothendieck回答的一些基准结果。不。omit()花费的时间是其他两个解决方案的20倍。我认为如果dplyr有一个函数,可能作为过滤器的一部分,那将是一件好事。

library('rbenchmark')
library('dplyr')

n = 5e6
n.na = 100000
df = data.frame(
    x1 = sample(1:10, n, replace=TRUE),
    x2 = sample(1:10, n, replace=TRUE)
)
df$x1[sample(1:n, n.na)] = NA
df$x2[sample(1:n, n.na)] = NA


benchmark(
    df %>% filter(complete.cases(x1,x2)),
    df %>% na.omit(),
    df %>% (function(x) filter(x, complete.cases(x)))()
    , replications=50)

#                                                  test replications elapsed relative
# 3 df %.% (function(x) filter(x, complete.cases(x)))()           50   5.422    1.000
# 1               df %.% filter(complete.cases(x1, x2))           50   6.262    1.155
# 2                                    df %.% na.omit()           50 109.618   20.217
魏波娃
2023-03-14

这对我很有效:

df %>%
  filter(complete.cases(df))    

或者更笼统一点:

library(dplyr) # 0.4
df %>% filter(complete.cases(.))

这样做的好处是,在将数据传递到筛选器之前,可以在链中修改数据。

另一个具有更多列的基准:

set.seed(123)
x <- sample(1e5,1e5*26, replace = TRUE)
x[sample(seq_along(x), 1e3)] <- NA
df <- as.data.frame(matrix(x, ncol = 26))
library(microbenchmark)
microbenchmark(
  na.omit = {df %>% na.omit},
  filter.anonymous = {df %>% (function(x) filter(x, complete.cases(x)))},
  rowSums = {df %>% filter(rowSums(is.na(.)) == 0L)},
  filter = {df %>% filter(complete.cases(.))},
  times = 20L,
  unit = "relative")

#Unit: relative
#             expr       min        lq    median         uq       max neval
 #         na.omit 12.252048 11.248707 11.327005 11.0623422 12.823233    20
 #filter.anonymous  1.149305  1.022891  1.013779  0.9948659  4.668691    20
 #         rowSums  2.281002  2.377807  2.420615  2.3467519  5.223077    20
 #          filter  1.000000  1.000000  1.000000  1.0000000  1.000000    20
包子航
2023-03-14

试试这个:

df %>% na.omit

或者这个:

df %>% filter(complete.cases(.))

或者这个:

library(tidyr)
df %>% drop_na

如果要根据一个变量的缺失进行筛选,请使用条件:

df %>% filter(!is.na(x1))

或者

df %>% drop_na(x1)

其他答案表明,上面的解决方案na.omit要慢得多,但这必须与它在na.action属性中返回省略行的行索引这一事实相平衡,而上面的其他解决方案则不然。

str(df %>% na.omit)
## 'data.frame':   2 obs. of  2 variables:
##  $ x1: num  1 2
##  $ x2: num  1 2
##  - attr(*, "na.action")= 'omit' Named int  3 4
##    ..- attr(*, "names")= chr  "3" "4"

已更新以反映最新版本的 dplyr 和注释。

已更新以反映最新版本的整理器和注释。

 类似资料:
  • 两个虚拟主机(纯静态-html 支持) - Two Virtual Hosts, Serving Static Files http { : server { : listen 80; : server_name www.domain1.com; : access_log logs/domain1.access.log main; : location / {

  • 本节我们将使用一个弹球的例子来完整地学习使用动画效果。 首先,我们把通用的框架部分写好,按照4.1节的方法实现动画重绘函数,并按6.2节的方法加入stat.js库: var requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || windo

  • 以下描述了一些 ApacheKafka ®的流行用例。有关这些领域的概述,请参阅 此博客中的文章。 消息 Kafka 很好地替代了传统的message broker(消息代理)。 Message brokers 可用于各种场合(如将数据生成器与数据处理解耦,缓冲未处理的消息等)。 与大多数消息系统相比,Kafka拥有更好的吞吐量、内置分区、具有复制和容错的功能,这使它成为一个非常理想的大型消息处理

  • 案例背景 在一场重大的直播节目活动中,直播正在进行当中,但是中间有一段精彩的,或者重要的内容需要进行快速作为新闻的重要视频素材进行分发,传统的方式是将需要直播结束之后将直播视频保存到本地,采用非编工具进行处理,然后再重新上传到云端,配上图文,进行视频的调用和分发。这样的一整套流程非常繁琐,也许当整个流程做完之后,这条新闻已经失去了作为头条的新鲜度。在这个场景里,我们要做的事情是第一时间去对直播视频

  • 我有一个Data.Frame,它由行组成,每个行都是URL,但当我运行“typeof”时,它的格式是一个列表。当我试图将它绑定到字符或数字格式的其他数据帧时,这会产生一些问题。我试图将这个Data.Frame转换为一个标准的Data.Frame,它显示了每一行的因子级别列表,每个URL都保持不变,占据每一行(长度不变)。 感谢帮助!

  • 这是来自 Nginx官方网站 的一个例子。 #!nginx : # 使用的用户和组 : user www www; : # 指定工作衍生进程数 : worker_processes 2; : # 指定 pid 存放的路径 : pid /var/run/nginx.pid; : # [ debug | info | notice | warn | error | crit ] : # 可以在