在数据框中计算距离。

4

我有一个包含时间和速度测量值(km/h)的大型数据框。以下是数据库的简短示例:

df <- data.frame(time = as.POSIXct(c("2019-04-01 13:55:18", "2019-04-01 14:03:18",
                                     "2019-04-01 14:14:18", "2019-04-01 14:26:55",
                                     "2019-04-01 14:46:55", "2019-04-01 15:01:55")),
                 speed = c(4.5, 6, 3.2, 5, 4, 2))

有没有办法创建一个新的数据框,从2019年4月1日14:00:00到2019年4月1日15:00:00,每20分钟计算行驶距离?假设速度变化是线性的。我试图用积分找到解决方案,但不确定是否这是正确的方法。感谢您的帮助!


只是为了明确,从13:55:18到14:03:18的速度为4.5公里每小时,从那时起直到14:26:55为止的速度为6公里每小时,以此类推。在这些间隔内,速度是恒定的,您想知道每20分钟覆盖了多少距离? - mnist
从下午2点到2点20分,速度为4.5时,时间是14:18,速度为6km/h时,时间是5:42。 - mnist
好的,我错过了第二个间隔。所以在前20分钟内会有三种不同的速度。 - mnist
1
应该解释得更清楚。速度会呈线性增长,因此不是恒定的。因此,在13:55:18和14:03:18之间,速度从4.5公里/小时增加到6公里/小时。 - Lerra
啊,有趣。祝你好运 :) - mnist
3
你应该从起点开始计算秒数,然后根据20分钟间隔添加分组,并查看每个速度分组内有多少秒。接着,你需要根据速度和在20分钟时间块内的时间计算加权平均值。 - Merijn van Tilborg
1个回答

3
这里有一个使用zoo :: na.approx dplyr 函数组合的解决方案。
library(zoo)
library(dplyr)

seq = data.frame(time = seq(min(df$time),max(df$time), by = 'secs'))
df <- merge(seq,df,all.x=T)
df$speed <- na.approx(df$speed)

df %>%
  filter(time >= "2019-04-01 14:00:00" & time < "2019-04-01 15:00:00") %>% 
  mutate(km = speed/3600) %>% 
  group_by(group = cut(time, breaks = "20 min")) %>% 
  summarise(distance = sum(km))

这将得到:

# A tibble: 3 x 2
  group               distance
  <fct>                  <dbl>
1 2019-04-01 14:00:00     1.50
2 2019-04-01 14:20:00     1.54
3 2019-04-01 14:40:00     1.16
解释: 第一步是创建一个时间段序列来计算两个时间点之间的速度(seq)。然后将该序列与数据框合并,并使用na.approx填充NAs。接下来,使用dplyr动词来过滤数据帧,并使用cut创建20分钟序列。最终的距离是20分钟时间范围内每1秒距离的总和。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接