如何在与R中另一列中的重复项相关联的列中对值进行求和?

时间:2016-01-29 05:18:48

标签: r

在R.工作我有一个数据框出租车,我按车辆ID排序,然后按时间戳排序(最早到最晚),看起来如下:

Taxi = arrange(Taxi, Taxi$vehicle_id, Taxi$timestamp)

Excel中数据框示例的图像

enter image description here

您会注意到"距离"列涵盖每辆出租车的每次行程之间的距离。我想利用一个公式来计算每个出租车的距离。同样,我会在时间戳上重复此过程,从最早的日期减去最新日期,以计算每辆车在道路上的时间。我希望使用和距离和时差来计算每辆出租车的速度。因此,最终产品将是一个如下所示的矩阵(等待转换为米和秒):

最终产品图片Excel中的示例

enter image description here

我相信R中的for循环在这里很有用,识别每个车辆ID,运行相关的距离值然后将它们相加,但我不确定从哪里开始。我从一个独特的出租车车辆ID数据集开始,以帮助R识别它们。以下是我到目前为止总结距离的内容;我不确定如何告诉R对每个车辆ID范围求和:

Taxi.uniques = unique(Taxi$vehicle_id)
for (i in Taxi) {
    look.at = Taxi$vehicle_id == i 
    sum(all distances for a vehicle ID)
} 

以下是我通过它最早的时间戳减去每辆车最新时间戳的方法:

Taxi.uniques = unique(Taxi$vehicle_id)
for (i in Taxi) {
    look.at = Taxi$vehicle_id == i 
    max(Taxi$timestamp[look.at]) - min(Taxi$timestamp[look.at]) 
}

不确定如果我走在正确的轨道上并会感激任何帮助!

2 个答案:

答案 0 :(得分:3)

如果您不反对使用data.table,您可以一步完成。

require(data.table)
taxi<-data.table(vehicleID=c('Taxi1','Taxi2','Taxi3','Taxi1','Taxi2','Taxi3'),
                 timestamp=Sys.time()+sample(60:600,6),
                 distance=sample(1:50,6))

taxi[vehicleID %in% c('Taxi1','Taxi3'),list(TimeonRoad=max(timestamp)-min(timestamp),
           Distance=sum(distance)),
     by='vehicleID']

data.table结构为DT[i, j, by]。 i用于按条件进行子集化,j用于对变量运行不同的操作或选择列,用于分组。将子集添加到i将为您提供所需的信息。

答案 1 :(得分:0)

这是使用dplyr的解决方案(更具可读性,恕我直言)

library(dplyr)

taxi %>%
  group_by(vehicleID) %>%
  summarize(
    time = max(timestamp) - min(timestamp),
    distance = sum(distance)
  )