Получить строку в CSV, где координаты XYZ перестают меняться - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть измерение объекта с координатами XYZ и временной шкалой в мс. Мой CSV выглядит следующим образом:

TimeInSec  X.6   Y.6  Z.6
0.000000    -1.383422   -0.058891   0.023290    
0.004167    -1.387636   -0.058947   0.023584
0.008333    -1.391491   -0.058972   0.023989
...

Я хочу найти строку в моем наборе данных, где координаты XYZ перестают изменяться (в пределах порога). Ключевой особенностью, которую я хочу, является время от строки 0 до точки остановки моего объекта.

Мой код:

dummy.data <- read.csv (file="D:\\tmp\\dummy.csv", header = TRUE, skip = 6
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()

Большое спасибо за вашу помощь!

Пример графика: Пример графика

Вот ссылка на RawData CSV RawData

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Я думаю, что из вашего описания вы просто хотите определить точку, в которой различия между значениями x, y и z в последовательных строках падают ниже определенного порога:

threshold <- 0.001
stop_row  <- which(abs(diff(dummy.data$X.6)) < threshold &
                   abs(diff(dummy.data$Y.6)) < threshold &
                   abs(diff(dummy.data$Z.6)) < threshold )

Итак, теперь вы можете сделать:

result <- dummy.data$TimeInSec[stop_row] - dummy.data$TimeInSec[1]
1 голос
/ 28 февраля 2020

Вот обновленный пример, который использует точно такой же код, как и раньше, но теперь я сделал несколько фиктивных данных, которые показывают различные смещения, и данные в конечном итоге устанавливаются в постоянное значение. Дело в том, что последовательные точки будут становиться все ближе и ближе, поэтому евклидово расстояние (воспринимайте это как фактическое расстояние) между последовательными точками будет меньше. Опустив пороговое значение, мы объявляем, что точки рассчитаны.

library(tidyverse)
library(ggplot2)
numberofpoints <- 100
threshold <- 0.01
set.seed(1)
dummy.data <- # make some dummy data with offsets
    data.frame(
        X.6=runif(numberofpoints), X.7=runif(numberofpoints), X.8=runif(numberofpoints),
        Y.6=runif(numberofpoints), Y.7=runif(numberofpoints), Y.8=runif(numberofpoints),
        Z.6=runif(numberofpoints), Z.7=runif(numberofpoints), Z.8=runif(numberofpoints)) %>%
    mutate(
        X.6=3+X.6/row_number(), X.7=1+X.7/row_number(), X.8=2+X.8/row_number(),
        Y.6=4+Y.6/row_number(), Y.7=6+Y.7/row_number(), Y.8=9+Y.8/row_number(),
        Z.6=5+Z.6/row_number(), Z.7=7+Z.7/row_number(), Z.8=10+Z.8/row_number()
    )

distances <- dist(dummy.data)  # find distances between all pairs of readings (will be slow for large data)
distances.matrix <- as.matrix(distances)
# distances between adjacent readings
distancechange <- c(NA,unlist(sapply(1:numberofpoints-1, function(r) distances.matrix[r,r+1])))
# the first point below the threshold
changebelowthreshold <- min(which(distancechange < threshold))

# Plot something
dummy.data$Time <- 1:nrow(dummy.data)
thresholdtime <- dummy.data$Time[changebelowthreshold]
plotdata <- dummy.data %>% pivot_longer(cols=c(X.6, X.7, X.8, Y.6, Y.7, Y.8, Z.6, Z.7, Z.8))
gg <- ggplot(plotdata, aes(x=Time, y=value, colour=name)) + geom_line() + geom_vline(xintercept = thresholdtime)

Это дает следующий график.

enter image description here

вертикальная линия показывает, где данные ниже порога.

...