获取 CSV 中 xyz 坐标停止变化的行
Get the row in a CSV where xyz coordinates stop changing
我用 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()
非常感谢您的帮助!
示例图:
Sample Graph
这是原始数据 CSV link RawData
这是一个更新的示例,它使用与以前完全相同的代码,但现在我制作了一些显示不同偏移量的虚拟数据,并且数据最终稳定为一个常数值。关键是连续的点会越来越近,因此连续点之间的欧几里得距离(将其视为实际距离)会越来越小。一旦低于阈值,我们宣布点数已结算。
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)
这样就形成了下面的情节。
垂直线显示数据低于阈值的位置。
根据你的描述,我认为你只是想确定一个点,在这个点上,连续行中的 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]
我用 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()
非常感谢您的帮助!
示例图: Sample Graph
这是原始数据 CSV link RawData
这是一个更新的示例,它使用与以前完全相同的代码,但现在我制作了一些显示不同偏移量的虚拟数据,并且数据最终稳定为一个常数值。关键是连续的点会越来越近,因此连续点之间的欧几里得距离(将其视为实际距离)会越来越小。一旦低于阈值,我们宣布点数已结算。
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)
这样就形成了下面的情节。
垂直线显示数据低于阈值的位置。
根据你的描述,我认为你只是想确定一个点,在这个点上,连续行中的 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]