You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定位CSV中XYZ坐标停止变化的行并计算对应时长

解决坐标稳定检测与时长计算问题

看起来你已经完成了数据读取和可视化的第一步,接下来咱们一步步解决“找到坐标稳定点并计算时长”的需求。

核心思路

要检测坐标停止变化,咱们需要:

  1. 定义稳定性阈值:判断坐标变化“足够小”的标准(比如变化绝对值小于0.0005)
  2. 计算每个坐标的逐行变化量
  3. 检测所有坐标同时满足稳定条件的连续行(避免偶然波动误判)
  4. 找到第一个稳定点后,计算起始到该点的时长

完整代码实现

首先加载需要的包,然后按步骤处理数据:

# 加载所需包
library(dplyr)
library(zoo)
library(ggplot2)
library(tidyr)

# 1. 读取数据(保持你原来的参数)
dummy.data <- read.csv(file="D:\\tmp\\dummy.csv", header = TRUE, skip = 6)

# 2. 自定义稳定性参数(根据你的数据调整!)
stability_threshold <- 0.0005  # 坐标变化绝对值小于这个值视为稳定
stable_consecutive <- 3        # 需要连续3行都稳定才判定为停止变化

# 3. 计算每个坐标的逐行变化绝对值
dummy.data <- dummy.data %>%
  mutate(
    # 计算X系列坐标的变化
    delta_X6 = abs(X.6 - lag(X.6)),
    delta_X7 = abs(X.7 - lag(X.7)),
    delta_X8 = abs(X.8 - lag(X.8)),
    # Y系列坐标的变化
    delta_Y6 = abs(Y.6 - lag(Y.6)),
    delta_Y7 = abs(Y.7 - lag(Y.7)),
    delta_Y8 = abs(Y.8 - lag(Y.8)),
    # Z系列坐标的变化
    delta_Z6 = abs(Z.6 - lag(Z.6)),
    delta_Z7 = abs(Z.7 - lag(Z.7)),
    delta_Z8 = abs(Z.8 - lag(Z.8))
  ) %>%
  # 第一行没有前一行数据,把NA替换为0
  replace(is.na(.), 0)

# 4. 标记每行是否所有坐标都稳定
dummy.data <- dummy.data %>%
  mutate(
    is_stable = (delta_X6 < stability_threshold) &
                (delta_X7 < stability_threshold) &
                (delta_X8 < stability_threshold) &
                (delta_Y6 < stability_threshold) &
                (delta_Y7 < stability_threshold) &
                (delta_Y8 < stability_threshold) &
                (delta_Z6 < stability_threshold) &
                (delta_Z7 < stability_threshold) &
                (delta_Z8 < stability_threshold)
  )

# 5. 检测连续稳定的行,找到第一个稳定点
dummy.data <- dummy.data %>%
  mutate(
    # 用滑动窗口检测连续stable_consecutive行是否都稳定
    consecutive_stable = rollapply(is_stable, width = stable_consecutive, FUN = all, align = "right", fill = FALSE)
  )

# 6. 获取第一个稳定点的时间,计算时长
first_stable_time <- dummy.data %>%
  filter(consecutive_stable) %>%
  slice(1) %>%
  pull(Time..Seconds.)

start_time <- dummy.data %>% slice(1) %>% pull(Time..Seconds.)
duration <- first_stable_time - start_time

# 输出结果
cat("第一个稳定点的时间:", first_stable_time, "秒\n")
cat("从起始到稳定点的时长:", duration, "秒\n")

优化可视化:标记稳定点

在你原来的绘图代码基础上,添加一条红色虚线标记稳定点,更直观:

dummy.data %>% 
  gather(key,value, X.6, X.7, X.8, Y.6, Y.7, Y.8, Z.6, Z.7, Z.8) %>% 
  ggplot(aes(x=Time..Seconds., y=value, colour=key)) + 
  geom_line() +
  geom_vline(xintercept = first_stable_time, color = "red", linetype = "dashed", linewidth=1) +
  labs(title = "Coordinate Changes Over Time", x = "Time (Seconds)", y = "Coordinate Value") +
  theme_minimal()

注意事项

  • 阈值调整:如果你的数据噪声较大,适当增大stability_threshold;如果需要更严格的稳定条件,减小阈值。
  • 连续行数设置:如果只看单行稳定,可能会把偶然的波动当成停止变化,设置stable_consecutive为2-5行更可靠。
  • 浮点误差:实际测量数据很少会完全不变,所以不要把阈值设为0,用极小的数值(比如1e-6)更合理。

内容的提问来源于stack exchange,提问作者holber

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 19:57:28