如何用R替换R中子集的值Tidyverse?
以cars数据为例,如果我想将speed低于30的全部变为0,我可以使用以下命令:
cars[cars["speed"] < 30,] <- 0
Run Code Online (Sandbox Code Playgroud)
使用Tidyverse,可以使用更可读的命令生成相同的子集:
cars %>% filter(speed < 30) %>% mutate(speed =0)
Run Code Online (Sandbox Code Playgroud)
但是,这改变了我们从中获取的数据子集cars,而不是内部观察值cars.
我可能错过了一些明显的东西但是有一种直观的方式来做同样的事情Tidyverse吗?虽然cars[cars["speed"] < 30,] <- 0在大多数情况下工作正常,但当满足超过5个条件时,它变得非常难以处理.
eip*_*i10 11
你可以使用这个replace功能:
cars %>% mutate(speed = replace(speed, speed < 30, 0))
Run Code Online (Sandbox Code Playgroud)
的ifelse条件也将工作:
cars %>% mutate(speed = ifelse(speed < 30, 0, speed))
Run Code Online (Sandbox Code Playgroud)
我在一百万行的数据帧上进行了测试,并replace在大约八分之一的时间内运行ifelse.
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
)
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)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
| 归档时间: |
|
| 查看次数: |
3133 次 |
| 最近记录: |