Расчет суточного максимального перемещения животного

Я новичок в R и мне понадобится помощь. У меня есть данные о перемещении животных со следующими столбцами: «TagID», «Date», «location.long», «location.lat»

Мне нужно найти расстояние между последовательными точками GPS отдельно за каждый день и для каждого человека. После этого я пытаюсь найти максимальное вытеснениеt для этого дня, что означает расстояние между первой точкой дня и самой дальней точкой этого животного за тот же день.

Вот структура данных:

    TagID   Date      location.long location.lat
1   6634 2018-10-22     10.311283     48.20341
2   6634 2018-10-22     10.319261     48.18381
3   6634 2018-10-22     10.321538     48.15845
4   6634 2018-10-22     10.293819     48.15497
5   6634 2018-10-22     10.369189     48.12718
6   6634 2018-10-22     10.333642     48.14402
7   6634 2018-10-23     10.256952     48.12419
8   6634 2018-10-23     10.283222     48.11557
9   6634 2018-10-23     10.264805     48.10601
10  6634 2018-10-23     10.358082     48.07012
11  6634 2018-10-23     10.310423     48.03421
12  6678 2018-10-22      9.981601     48.24799
13  6678 2018-10-22      9.999586     48.22714
14  6678 2018-10-22      9.963930     48.29394
15  6678 2018-10-22      9.989562     48.17918

До сих пор я дошел до этой точки:

mydata <- read.csv("tracking.csv")
onlcoor <- subset (mydata, select = c("location.long","location.lat"))
m <- as.matrix(onlcoor)
#Creates a matrix witht the distances between each point in the dataset
mydata$dist <- distm(m, fun=distVincentyEllipsoid)
#Returns the maximum distance between the first point the farthest from it
mydata$displacement <- max(mydata$dist[,1])

Он вычисляет расстояние между последовательными точками и возвращает смещение (расстояние между первой и самой дальней точкой от нее).

Теперь я хотел бы добавить в код два условия

  1. TagID не учитывается. Следовательно, расстояние для последнего местоположения животного будет сгенерировано с использованием первого местоположения нового животного, когда расстояние должно быть NA.
  2. Дату также следует принимать во внимание, потому что мне нужно максимальное ежедневное перемещение каждого человека.

Вот код, который наконец-то сработал для меня:

mydata <- read.csv("tracking.csv")    
mydata <- split(mydata, list(mydata$TagID, mydata$Date), drop = TRUE)
displacem <- sapply(mydata, function(mydata){
     onlcoor <- subset (mydata, select = 
c("location.long","location.lat"))
     m <- as.matrix(onlcoor)
     mydata$dist <- distm(m, fun=distVincentyEllipsoid)
     mydata$displ <- max(mydata$dist[,1]) 
   })
write.table(displacem, file = "maximum_displacement.csv",row.names=FALSE, 
na = "",col.names=FALSE, sep = ",")

Я бы подошел к этому следующим образом. Во-первых, я бы сделал функцию, которая принимала бы data.frame и возвращала бы расстояние, которое вы прошли (то, что у вас есть на данный момент). Затем я переводил дату в формат Y-m-d (время отбрасывать). Затем я бы разделил данные по TagID и этой новой дате. Таким образом, каждый блок будет иметь желаемое подмножество TagID-day. Примените вышеуказанную функцию к этому подмножеству, и все готово. Вы можете использовать функции split и lapply (или sapply, если хотите :)).

Roman Luštrik 27.10.2018 10:38

Обратите внимание, что есть куча пакетов, посвященных перемещению (животных). См. Представление задач CRAN: обработка и анализ пространственно-временных данных и, например, adehabitatLT: Анализ перемещений животных. Удачи!

Henrik 27.10.2018 11:10

Вы также можете рассмотреть возможность предоставления достаточно сложных данных об игрушках - поскольку вы хотите рассчитать движение на животное в день, было бы неплохо, если бы у вас было 3-4 позиции в день для двух животных. Ваше здоровье.

Henrik 27.10.2018 11:50

@ RomanLuštrik Спасибо за подсказку! lapply кажется очень полезной функцией.

VSta 27.10.2018 17:14

@ RomanLuštrik Я преобразовал формат даты, как вы предложили. Затем разделил данные по TagID и Date и попытался вычислить расстояния между точками внутри блоков. Вроде работает и правильно создана матрица с расстояниями между каждой точкой. Однако, когда я пытаюсь получить максимальное смещение, он возвращает одно и то же значение для каждых трех наборов. Что я сделал не так? Я добавил скрипт, который написал как правку к вопросу

VSta 27.10.2018 17:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
279
0

Другие вопросы по теме