我有一个数据框,每行代表一个记录的事件。举个例子,假设我测量了过往车辆的速度,有些车辆经过我不止一次。
cardata <- data.frame(
car.ID = c(3,4,1,2,5,4,5),
speed = c(100,121,56,73,87,111,107)
)
我可以对列表进行排序并拉出三个最快的事件......
top3<-head(cardata[order(cardata$speed,decreasing=TRUE),],n=3)
> top3
car.ID speed
2 4 121
6 4 111
7 5 107
...但你会注意到4号车记录了两次最快的时间。如何在没有任何重复车辆ID的情况下找到三个最快的事件?我意识到,在这个例子中,“前三名”列表可能不会包含三个最快的事件。
答案 0 :(得分:6)
您可以使用aggregate
来查找每car.ID
的最高速度:
cartop <- aggregate(speed ~ car.ID, data = cardata, FUN = max)
top3 <- head(cartop[order(cartop$speed, decreasing = TRUE), ], n = 3)
# car.ID speed
# 4 4 121
# 5 5 107
# 3 3 100
答案 1 :(得分:3)
使用data.table
代替data.frame
:
library(data.table)
dt = data.table(cardata)
# the easier to read way
dt[order(-speed), speed[1], by = car.ID][1:3]
# car.ID V1
#1: 4 121
#2: 5 107
#3: 3 100
# (probably) a faster way
setkey(dt, speed) # faster sort by speed
tail(dt[, speed[.N], by = car.ID], 3)
# car.ID V1
#1: 5 107
#2: 3 100
#3: 4 121
# and another way for fun (not sure how fast it is)
setkey(dt, car.ID, speed)
tail(dt[J(unique(car.ID)), mult = 'last'], 3)
答案 2 :(得分:3)
使用plyr
,你也可以这样做。例如,选择前三名:
library(plyr)
top3 <- ddply(ddply(cardata,.(car.ID),summarize, maxspeed=max(speed)),.(-maxspeed))[1:3,-1]
<强>更新强>
使用dplyr
软件包,您可以更快速,更清晰地完成此任务。
require(dplyr)
# Select for each car.ID the observation with the highest speed and sort.
top <- cardata %>%
group_by(car.ID) %>%
arrange(-speed)%>%
top_n(1)
# Take the top 3 of the resulting table.
top3 <- top[1:3,]
top3
# car.ID speed
# 1 4 121
# 2 5 107
# 3 3 100
答案 3 :(得分:2)
这是另一种基础R方式:
top.speeds <- unique(transform(cardata, speed=ave(speed, car.ID, FUN=max)))
top3 <- head(top.speeds[order(top.speeds$speed, decreasing=TRUE), ], n=3)
# car.ID speed
# 2 4 121
# 5 5 107
# 1 3 100
答案 4 :(得分:2)
我更喜欢使用基础R建议的解决方案,但为了完整性,这是使用sqldf
的另一种方式:
library(sqldf)
cardata <- data.frame(
car.ID = c(3,4,1,2,5,4,5),
speed = c(100,121,56,73,87,111,107)
)
sqldf("
select car_ID, max(speed) as max_speed
from cardata
group by car_ID
order by max(speed) desc
limit 3
")