用 Tidyverse 替换 R 中的子集
Replacing subsets in R with Tidyverse
如何用 Tidyverse
替换 R 中子集的值?
以cars
数据为例,如果我想把所有小于30的speed
都变成0,可以用下面的命令:
cars[cars["speed"] < 30,] <- 0
使用Tidyverse
,可以用更具可读性的命令生成相同的子集:
cars %>% filter(speed < 30) %>% mutate(speed =0)
然而,这改变了我们从 cars
中取出的数据子集,而不是 cars
中的观察值。
我可能错过了一些明显的东西,但是有没有一种直观的方法可以用 Tidyverse
做同样的事情?虽然 cars[cars["speed"] < 30,] <- 0
在大多数情况下工作正常,但当一个人要满足 5 个以上的条件时,它会变得非常笨拙。
您可以使用 replace
函数:
cars %>% mutate(speed = replace(speed, speed < 30, 0))
ifelse
条件也适用:
cars %>% mutate(speed = ifelse(speed < 30, 0, speed))
我在一百万行的数据帧上测试了这个,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
)
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
如何用 Tidyverse
替换 R 中子集的值?
以cars
数据为例,如果我想把所有小于30的speed
都变成0,可以用下面的命令:
cars[cars["speed"] < 30,] <- 0
使用Tidyverse
,可以用更具可读性的命令生成相同的子集:
cars %>% filter(speed < 30) %>% mutate(speed =0)
然而,这改变了我们从 cars
中取出的数据子集,而不是 cars
中的观察值。
我可能错过了一些明显的东西,但是有没有一种直观的方法可以用 Tidyverse
做同样的事情?虽然 cars[cars["speed"] < 30,] <- 0
在大多数情况下工作正常,但当一个人要满足 5 个以上的条件时,它会变得非常笨拙。
您可以使用 replace
函数:
cars %>% mutate(speed = replace(speed, speed < 30, 0))
ifelse
条件也适用:
cars %>% mutate(speed = ifelse(speed < 30, 0, speed))
我在一百万行的数据帧上测试了这个,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
)
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