我正试图找到一种简单的方法,用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))

通过使用whichreplace提供一个索引,可以将其速度提高一点:

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

R相关问答推荐

如何删除字符串中重复的字符序列?

使用gggplot 2在R中正确表示翻转堆叠条形图中的数据

计算转换的次数

R的GG平行坐标图中的排序变量

使用ggplot 2根据R中的类别排列Likert比例gplot

如何使用tryCatch执行语句并忽略警告?

如何提取所有完美匹配的10个核苷酸在一个成对的匹配与生物字符串在R?>

从一个列表的框架中移除列表包装器

仅在Facet_WRAP()中的相应方面包含geom_abline()

过滤名称以特定字符串开头的文件

根据另一列中的值和条件查找新列的值

R中Gamma回归模型均方误差的两种计算方法不一致

R+reprex:在呈现R标记文件时创建可重现的示例

优化从每个面的栅格中提取值

我如何使用tidyselect来传递一个符号数组,比如Pivot_Long?

如何在PrePlot()中将多个元素设置为斜体

将工作目录子文件夹中的文件批量重命名为顺序

创建新列,其中S列的值取决于该行S值是否与其他行冗余

对R中的列表列执行ROW Mean操作

使用geom_sf跨越日期线时的闭合边界