假设以下数据
OriginId, OriginName, DestinationId, DestinationName,Time
1 , Origin 1, 1 , Destination 1 , 20
1 , Origin 1, 2 , Destination 2 , 25
2 , Origin 2, 3 , Destination 3 , 14
2 , Origin 2, 4 , Destination 4 , 29
这是一张CSV,用于保存始发地和目的地之间的旅行时间。我想找到每个来源最近的目的地。换句话说,我必须按OriginId对数据进行分组,并根据时间给每个组赋予排名,并获得排名为1的行。因此,上述数据的预期结果为:
OriginId, OriginName, DestinationId, DestinationName,Time(Minute)
1 , Origin 1, 1 , Destination 1 , 20
2 , Origin 2, 3 , Destination 3 , 14
分组后我需要使用哪个R功能?
答案 0 :(得分:3)
使用dplyr
,可以按'OriginId'进行分组,然后获取具有which.min
最小'时间'的'时间'行索引,并使用slice
提取该行。
library(dplyr)
df1 %>%
group_by(OriginId) %>%
slice(which.min(Time))
或者,如果我们考虑使用data.table
,请将'data.frame'转换为'data.table'(setDT(df1)
),按'OriginId'分组,我们得到行索引(如在前一种情况下)并对数据集的行(.SD
)进行子集化。
library(data.table)
setDT(df1)[, .SD[which.min(Time)], by = OriginId]