gpt4 book ai didi

r - 将不同级别的最大值添加到 data.frame 中的新列

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

我有以下 R 问题。我做了一个实验,观察了一些汽车的速度。我有一张 table ,上面有汽车(其中数字 1 表示例如 Porche、2 Volvo 等)及其速度。一辆车可能不止一次被带入观察。因此,例如,保时捷被观察了两次,沃尔沃被观察了两次。

exp<-data.frame(car=c(1,1,1,2,2,3),speed=c(10,20,30,40,50,60))

我想添加第三列,计算每一行/每辆车的最大速度。所以它看起来像这样:

exp<-data.frame(car=c(1,1,1,2,2,3),speed=c(10,20,30,40,50,60), maxSpeed=c(30,30,30,50,50,60))

保时捷的最大观察速度为 30,因此保时捷的每一行都将获得 maxSpeed = 30。

我知道它应该是apply/sapply函数,但不知道如何实现它。任何人? :)

最佳答案

@Arun 这是我在更大样本(1000 条记录)中的结果。中位数的比率现在(实际上)是 0.82:

exp <- data.frame(car=sample(1:10, 1000, T),speed=rnorm(1000, 20, 5))

f1 <- function() mutate(exp, maxSpeed = ave(speed, car, FUN=max))
f2 <- function() transform(exp, maxSpeed = ave(speed, car, FUN=max))

library(microbenchmark)
library(plyr)
> microbenchmark(f1(), f2(), times=1000)
Unit: microseconds
expr min lq median uq max neval
f1() 551.321 565.112 570.565 589.9680 27866.23 1000
f2() 662.933 683.138 689.552 713.7665 28510.24 1000

plyr 文档本身说,对于大型数据帧,Mutate 似乎比 transform 快得多。

但是,对于这种情况,您可能是对的。如果我放大样本:

> exp <- data.frame(car=sample(1:1000, 100000, T),speed=rnorm(100000, 20, 5))
> microbenchmark(f1(), f2(), times=100)
Unit: milliseconds
expr min lq median uq max neval
f1() 37.92438 39.00056 40.66607 41.18115 77.41645 100
f2() 39.47731 40.28650 43.11927 43.70779 78.34878 100

比率接近一。老实说,我非常确定 plyr 的性能(在我的代码中总是依赖它),这就是我在评论中“声明”的原因。可能在不同的情况下它表现得更好..

编辑:

使用来自@Arun 评论的f3()

> microbenchmark(f1(), f2(), f3(), times=100)
Unit: milliseconds
expr min lq median uq max neval
f1() 38.76050 39.57129 41.48728 42.14812 76.94338 100
f2() 40.38913 41.19767 44.12329 44.78782 79.94021 100
f3() 38.63606 39.58700 40.24272 42.04902 76.07551 100

是的!稍微快一点……移动更少的数据?

关于r - 将不同级别的最大值添加到 data.frame 中的新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16195091/

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