使用 dplyr 将某些值设置为 NA

2023-11-25

我试图找出一种简单的方法来使用 dplyr (数据集 = dat,变量 = x)执行类似的操作:

dat$x[dat$x<0]=NA

应该很简单,但这是我目前能做的最好的事情。有更容易的方法吗?

dat = dat %>% mutate(x=ifelse(x<0,NA,x))

您可以使用replace这比ifelse:

dat <-  dat %>% mutate(x = replace(x, x<0, NA))

您可以通过提供索引来加快速度replace using which:

dat <- dat %>% mutate(x = replace(x, which(x<0L), NA))

在我的机器上,这将时间减少了三分之一,见下文。

这是不同答案的一些比较,当然这只是指示性的:

set.seed(24)
dat <- data.frame(x=rnorm(1e6))
system.time(dat %>% mutate(x = replace(x, x<0, NA)))
       User      System     elapsed
       0.03        0.00        0.03 
system.time(dat %>% mutate(x=ifelse(x<0,NA,x)))
       User      System     elapsed
       0.30        0.00        0.29 
system.time(setDT(dat)[x<0,x:=NA])
       User      System     elapsed
       0.01        0.00        0.02 
system.time(dat$x[dat$x<0] <- NA)
       User      System     elapsed
       0.03        0.00        0.03 
system.time(dat %>% mutate(x = "is.na<-"(x, x < 0)))
       User      System     elapsed
       0.05        0.00        0.05 
system.time(dat %>% mutate(x = NA ^ (x < 0) * x))
       User      System     elapsed
       0.01        0.00        0.02 
system.time(dat %>% mutate(x = replace(x, which(x<0), NA)))
       User      System     elapsed
       0.01        0.00        0.01 

(我正在使用 dplyr_0.3.0.2 和 data.table_1.9.4)


由于我们始终对基准测试非常感兴趣,尤其是在 data.table-vs-dplyr 讨论过程中,我使用 microbenchmark 和 akrun 的数据提供了 3 个答案的另一个基准测试。注意我修改了dplyr1作为我的答案的更新版本:

set.seed(285)
dat1 <- dat <- data.frame(x=sample(-5:5, 1e8, replace=TRUE), y=rnorm(1e8))
dtbl1 <- function() {setDT(dat)[x<0,x:=NA]}
dplr1 <- function() {dat1 %>% mutate(x = replace(x, which(x<0L), NA))}
dplr2 <- function() {dat1 %>% mutate(x = NA ^ (x < 0) * x)}
microbenchmark(dtbl1(), dplr1(), dplr2(), unit='relative', times=20L)
#Unit: relative
#    expr      min       lq   median       uq      max neval
# dtbl1() 1.091208 4.319863 4.194086 4.162326 4.252482    20
# dplr1() 1.000000 1.000000 1.000000 1.000000 1.000000    20
# dplr2() 6.251354 5.529948 5.344294 5.311595 5.190192    20
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 dplyr 将某些值设置为 NA 的相关文章

随机推荐

  • 是否存在具有编程语言本地化版本的编译器?

    我经常想知道为什么非英语程序员在编程时被迫使用不同的语言 而提供一个可以用本地化版本替换关键字的 IDE 似乎很容易 为什么德国人不能使用 w hrend macht 循环 日本 德国 法国 西班牙 博茨瓦纳的程序员只是广泛使用宏 定义语句
  • 根据另一个向量对点向量进行排序

    我正在开发一个 C 应用程序 我有 2 个点向量 vector
  • 显示:表格与使用表格

    我想知道使用 CSS 显示属性来模拟一个非常简单的论坛系统的表格是否是一个好主意 我知道这不是一件好事 就像 2 年前那样 当时 IE 和其他浏览器可能不支持 display table table cell 等 但我认为现在所有浏览器都支
  • Keycloak 管理控制台无限期加载

    我有一个在 EKS 集群中运行的 Keycloak 服务器 我尝试将其配置为生产模式而不是开发模式 我已经设法让 SSL 与反向代理一起使用 但是当我进入管理控制台的登录页面时 它只是无限期地加载 这是我的配置 Dockerfile FRO
  • PHP 特征的 UML 表示

    我正在使用 Symfony2 Doctrine 创建项目并尝试实现特征 到目前为止 小型试用没有问题 但我通常在深入复杂项目之前先绘制 UML 类和序列图 据我所知 用于象征 PHP 特征 可以视为行为 的 UML 设计对象是什么 有什么干
  • Java Webservice 客户端 UsernameToken 相当于 PHP

    我有一个 PHP 构建的 Web 服务 它使用 UsernameToken 作为身份验证机制 我有可以访问此 Web 服务的 PHP 客户端代码 现在我需要在 Java 中执行此操作 也许你可以帮助我 可以使用以下 php 代码访问该服务
  • 静态方法是否共享其局部变量以及不同线程并发使用时会发生什么?

    C 问题 我试图确定是否可以使用静态方法 在该方法内它确实使用了一些局部变量 局部变量是否在该方法的使用中 共享 例如 如果从不同线程同时调用 使用静态方法会发生什么 一个线程是否会阻塞 直到另一个线程完成等 也许普遍的问题是 在线程应用程
  • 更改Delphi OpenDialog的目录

    该计划的一些背景 该程序使用选项卡式界面同时处理多个文件 我正在尝试更改 OpenDialog 的目录 因此每次调用打开文件时都会显示我当前正在处理的文件的目录 但即使我设置InitialDir对于文件的路径 它始终显示最后打开的文件目录
  • GlassFish 5.0 异常且端口 4848 无响应

    昨天我下载了 GlassFish 5 0 和 JDK9 当我尝试运行服务器时asadmin start domainGlassFish 发送给我例外 当我尝试使用 asadmin start domainAfter 时 我得到响应 远程服务
  • 获取 GridSearchCV 的标准差

    在 scikit learn 0 20 之前我们可以使用result grid scores result best index 以获得标准差 它返回例如 mean 0 76172 std 0 05225 params n neighbor
  • 睡眠模式和深度睡眠模式有什么区别?

    我想知道Android手机中的睡眠模式和深度睡眠模式有什么区别 以及当手机进入睡眠模式和深度睡眠模式时会有什么影响 请给我详细的答案 问候 皮克斯 正如有人在已删除的答案中所写 深度睡眠模式与休眠和启动时间没有任何关系 You should
  • 如何使用 svg/canvas 绘制不规则/手绘线?

    我想绘制一条可调整大小的垂直线 基于页面内容 但它似乎是手绘的 而不是直线 我目前正在考虑使用 SVG 或 Canvas 来实现这一点 该线将沿着我的网页的一侧延伸 因此需要在容器的顶部和底部之间可扩展 我怎样才能实现这个目标 那么你想画一
  • 如何引用数据框表达式中的多个列?

    写这个很笨拙 df a lt df b df c 有没有办法做到 相当于 with df a lt b c 我们可以用with command df a lt with df b c 另一种选择是使用attach 然而不推荐 attach
  • MATLAB 中的信号量和锁

    我正在开发一个 MATLAB 项目 希望有两个 MATLAB 实例并行运行并共享数据 我将调用这些实例MAT 1 and MAT 2 更具体地说 该系统的架构是 MAT 1按顺序处理图像 使用以下命令一一读取它们imread 并使用输出每个
  • C++11 与现有库/框架的兼容性

    我想知道一些我还没有找到令人信服的答案的事情 情况 带有一些库 例如 gtkmm 的系统在未启用 c 11 的情况下进行编译 启用 C 11 编译的应用程序 两者都使用相同的 GCC 版本 环境进行编译和链接 该应用程序对使用 std st
  • 使用静态向量时_Orphan_range崩溃

    在我的项目中 我使用静态对象的构造函数来收集指针 就像注册方法一样 很简单 没有魔法 但在开始时我遇到了崩溃 我无法解释这里发生了什么 在使用 MSVC 或 Clang 的 Windows 上可以重现崩溃 两者都使用 MSVC 标头 给出以
  • conda 环境是否可以访问“root”环境? (==系统包)?

    conda 中的 根 环境是什么 它只是一个 仅 使用系统包的环境吗 其他环境是否也使用系统包 我假设优先考虑它们的重复版本 或者我是否需要将所有软件包安装在我想要使用它们的环境中 有没有办法将其配置为选项 我安装了系统包 但在 conda
  • 需要一次遍历 SQL 表行(表太大而无法使用适配器。填充)

    对我来说 阅读这样一个小型 SQL Server 2005 表很容易 string cmdText select from myTable SqlDataAdapter adapter new SqlDataAdapter cmdText
  • AS3 函数中可以有“ByRef”参数吗?

    任何想法如何返回多个变量来自 ActionScript 3 中的函数 任何像 VB NET 这样的东西你都可以拥有输入参数的变量修改 ByRef 参数 Sub do ByRef inout As Integer inout 5 End Su
  • 使用 dplyr 将某些值设置为 NA

    我试图找出一种简单的方法来使用 dplyr 数据集 dat 变量 x 执行类似的操作 dat x dat x lt 0 NA 应该很简单 但这是我目前能做的最好的事情 有更容易的方法吗 dat dat gt mutate x ifelse