问题描述
我试图找出一个简单的方法来使用dplyr(data set = dat,variable = x)来做这样的事情:
I'm trying to figure out a simple way to do something like this with dplyr (data set = dat, variable = x):
c $ cYou can speed it up a bit more by supplying an index to replace using which:
dat <- dat %>% mutate(x = replace(x, which(x<0L), NA))在我的机器上,将时间缩短到三分之一,见下文。
On my machine, this cut the time to a third, see below.
这里有一些比较不同的答案,这仅仅是当然的:
Here's a little comparison of the different answers, which is only indicative of course:
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)
(I'm using dplyr_0.3.0.2 and data.table_1.9.4)
由于我们对基准测试非常感兴趣,特别是在data.table-vs- dplyr讨论我提供了另一个基准的3个答案使用微基准和akrun的数据。请注意,我修改了 dplyr1 作为我的答案的更新版本:
Since we're always very interested in benchmarking, especially in the course of data.table-vs-dplyr discussions I provide another benchmark of 3 of the answers using microbenchmark and the data by akrun. Note that I modified dplyr1 to be the updated version of my answer:
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这篇关于用dplyr将某些值设置为NA的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!