Я новичок в 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])
Он вычисляет расстояние между последовательными точками и возвращает смещение (расстояние между первой и самой дальней точкой от нее).
Теперь я хотел бы добавить в код два условия
Вот код, который наконец-то сработал для меня:
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 = ",")
Обратите внимание, что есть куча пакетов, посвященных перемещению (животных). См. Представление задач CRAN: обработка и анализ пространственно-временных данных и, например, adehabitatLT: Анализ перемещений животных. Удачи!
Вы также можете рассмотреть возможность предоставления достаточно сложных данных об игрушках - поскольку вы хотите рассчитать движение на животное в день, было бы неплохо, если бы у вас было 3-4 позиции в день для двух животных. Ваше здоровье.
@ RomanLuštrik Спасибо за подсказку! lapply кажется очень полезной функцией.
@ RomanLuštrik Я преобразовал формат даты, как вы предложили. Затем разделил данные по TagID и Date и попытался вычислить расстояния между точками внутри блоков. Вроде работает и правильно создана матрица с расстояниями между каждой точкой. Однако, когда я пытаюсь получить максимальное смещение, он возвращает одно и то же значение для каждых трех наборов. Что я сделал не так? Я добавил скрипт, который написал как правку к вопросу
Я бы подошел к этому следующим образом. Во-первых, я бы сделал функцию, которая принимала бы data.frame и возвращала бы расстояние, которое вы прошли (то, что у вас есть на данный момент). Затем я переводил дату в формат Y-m-d (время отбрасывать). Затем я бы разделил данные по TagID и этой новой дате. Таким образом, каждый блок будет иметь желаемое подмножество TagID-day. Примените вышеуказанную функцию к этому подмножеству, и все готово. Вы можете использовать функции
split
иlapply
(илиsapply
, если хотите :)).