用Tidyverse替换R中的子集

时间:2017-04-10 19:47:43

标签: r tidyverse

如何用self替换R中子集的值?

Tidyverse数据为例,如果我想将低于30的所有cars更改为0,我可以使用以下命令:

speed

使用 cars[cars["speed"] < 30,] <- 0 ,可以使用更易读的命令生成相同的子集:

Tidyverse

但是,这会改变我们从 cars %>% filter(speed < 30) %>% mutate(speed =0) 取出的数据子集,而不是cars内的观察值。

我可能错过了一些明显的东西但是有一种直观的方法可以用cars做同样的事情吗?虽然Tidyverse在大多数情况下都能正常工作,但当一个人遇到超过5个条件时会变得非常笨拙。

1 个答案:

答案 0 :(得分:11)

您可以使用replace功能:

cars %>% mutate(speed = replace(speed, speed < 30, 0))

ifelse条件也适用:

cars %>% mutate(speed = ifelse(speed < 30, 0, speed))

我在一百万行数据框架上对此进行了测试,replaceifelse的约八分之一时间内运行。

library(microbenchmark)

set.seed(2)
dat = data.frame(x=runif(1e6, 0, 1000), y=runif(1e6, 0, 1000))

microbenchmark(
  replace=dat %>% mutate(x=replace(x, x<200, 0)),
  ifelse=dat %>% mutate(x=ifelse(x<200, 0, x)),
  if_else=dat %>% mutate(x=if_else(x<200, 0, x)),
  times=100
)
Unit: milliseconds
    expr       min       lq      mean   median        uq      max neval cld
 replace  8.352943  9.55682  18.16755 11.45507  15.33215 224.8759   100 a  
  ifelse 71.782371 87.37754 165.95928 95.12722 262.73016 287.3633   100   c
 if_else 39.947845 47.83934  88.72291 51.99449  59.76760 251.0381   100  b