Мой data.frame (motion.data) выглядит так:
head(movement.data)
Longitude Latitude Sample X Y
1 -1.581638 53.81659 1099.99 95.41699 65.88299
2 -1.581642 53.81659 1100.09 95.17410 65.89411
3 -1.581646 53.81659 1100.19 94.93121 65.80516
4 -1.581650 53.81659 1100.30 94.65550 65.74956
5 -1.581650 53.81659 1100.30 94.65550 65.74956
6 -1.581654 53.81659 1100.49 94.41261 65.60501
7 -1.581657 53.81659 1100.59 94.20254 65.59389
8 -1.581660 53.81659 1100.69 93.97934 65.57165
9 -1.581662 53.81659 1100.80 93.88088 65.54941
10 -1.581662 53.81659 1100.80 93.88088 65.54941
11 -1.581661 53.81659 1100.90 93.90714 65.42709
12 -1.581661 53.81659 1101.00 93.89401 65.50493
13 -1.581660 53.81659 1101.19 93.96621 65.69396
14 -1.581658 53.81659 1101.29 94.12376 65.76068
> structure(list(Longitude = c(-1.5816382, -1.5816419, -1.5816456,
-1.5816498, -1.5816498, -1.5816535, -1.5816567, -1.5816601, -1.5816616,
-1.5816616, -1.5816612, -1.5816614, -1.5816603, -1.5816579, -1.5816551,
-1.581652), Latitude = c(53.8165922, 53.8165923, 53.8165915,
53.816591, 53.816591, 53.8165897, 53.8165896, 53.8165894, 53.8165892,
53.8165892, 53.8165881, 53.8165888, 53.8165905, 53.8165911, 53.8165925,
53.8165926), Sample = c(1099.99, 1100.09, 1100.19, 1100.3, 1100.3,
1100.49, 1100.59, 1100.69, 1100.8, 1100.8, 1100.9, 1101, 1101.19,
1101.29, 1101.39, 1101.5), X = c(95.4169935430477, 95.1741017603222,
94.9312120174133, 94.6554984032894, 94.6554984032894, 94.4126097693692,
94.2025416091894, 93.9793443981241, 93.8808752899916, 93.8808752899916,
93.9071363032427, 93.8940054603786, 93.9662126575805, 94.1237625957496,
94.3075692760132, 94.5110727848407), Y = c(65.8829940372709,
65.8941135300653, 65.8051575885002, 65.7495601253183, 65.7495601253183,
65.6050067205713, 65.5938872277769, 65.5716482421881, 65.5494092573894,
65.5494092573894, 65.4270948374411, 65.5049312862118, 65.6939626613463,
65.7606796173226, 65.9163525148641, 65.9274720076584)), row.names = 11000:11015, class = "data.frame")
Я хочу вычислить угловое смещение между координатами X и Y.Я написал цикл for для итерации по data.frame (см. Код ниже).
Angular.Displacement <- vector("numeric", length(movement.data$X))
for (dp in movement.data) {
i <- 2
while(i <= length(movement.data$X)) {
a <- c((movement.data$X[i] - movement.data$X[i - 1]), (movement.data$Y[i] - movement.data$Y[i - 1]))
b <- c((movement.data$X[i + 1] - movement.data$X[i]), (movement.data$Y[i + 1] - movement.data$Y[i]))
dot.prod <- a %*% b
norm.a <- norm(a, type = "2")
norm.b <- norm(b, type = "2")
Angular.Displacement[i] = acos((dot.prod) / (norm.a * norm.b)) * (180 / pi)
i <- i+1
}
}
Хотя этот код работает, он неуклюж и не очень эффективен.Я преобразовал цикл в функцию (compute_angular_displacement - см. Ниже), чтобы я мог применить его к моему data.frame, используя mutate из библиотеки dplyr.
compute_angular_displacement <- function(df) {
# Calculation coefficients
a <- c((df$X - lag(df$X)), (df$Y - lag(df$Y)))
b <- c((lead(df$X) - df$X), (lead(df$Y) - df$Y))
dot.prod <- a %*% b
norm_a <- norm(a, type = "2")
norm_b <- norm(b, type = "2")
# Calculation for angular displacement
Angular_Displacement = acos((dot.prod)/(norm_a * norm_b)) * (180/pi)
}
Однако, когда я применяю функцию (см. Кодниже) Я получаю этот код ошибки (пример кода mutate ниже):
movement.data <- mutate(movement.data, Angular_Displacement = compute_angular_displacement(movement.data))
Ошибка в SVD (x, nu = 0L, nv = 0L): бесконечные или отсутствующие значения в 'x'
Я вручную проверил свои вычисления вне функции.Когда я применил метод и расчеты к выбранным точкам данных из motion.data в оболочке, они вернули правильный ответ.
Дальнейшие исследования показали, что ошибка возникает из-за использования функций 'lag' и 'lead', когда они вызываются, они выдают значения NA внутри c () и, в свою очередь, выдают ошибку, когда норма ".a <- норма (a, type = "2") "запущена.</p>
Кто-нибудь знает, как решить эту проблему?- Возможное быстрое решение проблемы - это комбинация между моим циклом while и функцией, но я не уверен, как этого добиться.Любая помощь в этом отношении будет принята с благодарностью.