2

我有以下 R 问题。我做了一个实验,观察了一些汽车的速度。我有一张桌子,上面有汽车(其中数字 1 表示例如保时捷、2 沃尔沃等)和它们的速度。一辆车可以被带入观察不止一次。因此,例如,Porche 被观察树次,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))

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

我知道它应该是应用/应用功能,但不知道如何实现它。任何人?:)

4

3 回答 3

2

@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 seems to be considerably faster than transform for large data frames.

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

> 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性能非常确定(在我的代码中总是依赖它),这就是我在评论中“声明”的原因。可能在不同的情况下它表现更好..

编辑:

使用f3()来自@Arun 评论

> 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

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

于 2013-04-24T17:03:04.317 回答
2

非常直截了当data.table

library(data.table)

exp <- data.table(exp)
exp[, maxSpeed := max(speed), by=car]

这使:

exp
   car speed maxSpeed
1:   1    10       30
2:   1    20       30
3:   1    30       30
4:   2    40       50
5:   2    50       50
6:   3    60       60
于 2013-04-24T17:15:41.913 回答
1
transform(exp, maxSpeed = ave(speed, car, FUN=max))

另一种使用方式split

exp$maxSpeed <- exp$speed
split(exp$maxSpeed, exp$car) <- lapply(split(exp$maxSpeed, exp$car), max)
exp
于 2013-04-24T14:51:05.487 回答