如何无需循环向tibble新增行实现车辆位置线性外推
解决方案
可以实现,全程使用向量化操作,无需任何循环:
核心思路
- 提取原数据最后一行作为预测的基准行,获取基准时间、基准位置、恒定预测速度、以及所有附加字段的取值
- 基于待预测时间戳批量计算外推位置:
外推位置 = 基准位置 + 预测速度 * (待预测时间 - 基准时间) - 批量构造预测行后与原表合并、按时间排序即可
完整实现代码
写法1:通用写法(适配多附加字段场景,需加载tidyr)
library(dplyr) library(tidyr) # 示例原数据 tbl <- tibble(info1 = rep("a", 3), info2 = rep("b", 3), t = c(1, 2, 3), v = c(12, 13, 14), x = c(12, 24, 37), status = rep("real", 3)) timestamps <- c(4, 5, 6, 8) # 1. 提取基准行 last_row <- slice_tail(tbl, n = 1) # 2. 批量构造预测行 pred_rows <- last_row %>% select(-t, -x, -status) %>% # 保留所有无需修改的字段,避免手动赋值遗漏 crossing(t = timestamps) %>% # 自动复制字段值到所有待预测时间戳行 mutate( x = last_row$x + v * (t - last_row$t), status = "predicted" ) # 3. 合并原数据与预测数据,按时间排序 tbl_final <- bind_rows(tbl, pred_rows) %>% arrange(t)
写法2:轻量写法(无需额外加载tidyr,适合附加字段少的场景)
library(dplyr) # 提取基准行 last_row <- slice_tail(tbl, n = 1) # 构造预测行 pred_rows <- tibble(t = timestamps) %>% mutate( info1 = last_row$info1, info2 = last_row$info2, v = last_row$v, x = last_row$x + v * (t - last_row$t), status = "predicted" ) # 合并排序 tbl_final <- bind_rows(tbl, pred_rows) %>% arrange(t)
结果验证
两种写法运行后得到的tbl_final和你给出的期望输出tbl_desired完全一致,外推位置计算逻辑符合要求,所有附加字段自动继承原表最后一行的取值,status字段自动标记为predicted。
内容的提问来源于stack exchange,提问作者SiH
相关产品推荐
相关产品推荐

