gpt4 book ai didi

用 Tidyverse 替换 R 中的子集

转载 作者:行者123 更新时间:2023-12-02 12:48:45 25 4
gpt4 key购买 nike

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

使用cars以数据为例,如果我想更改所有speed低于30变成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 中的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43331798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com