我正试图找到一种简单的方法,用dplyr(data set=dat,variable=x)做类似的事情:
day$x[dat$x<0]=NA
应该很简单,但这是我目前能做的最好的了.有没有更简单的方法?
dat = dat %>% mutate(x=ifelse(x<0,NA,x))
我正试图找到一种简单的方法,用dplyr(data set=dat,variable=x)做类似的事情:
day$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))
通过使用which
为replace
提供一个索引,可以将其速度提高一点:
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和数据.表_1.9.4)
因为我们总是对基准测试非常感兴趣,尤其是在数据过程中.表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