У меня есть эта воспроизводимые data.frame
представляющих местоположения UTM для пяти особей (IndID
), каждый из которых имеет 20 местДобавление значений на основе уровней фактора
РЕДАКТИРОВАТЬ: Различные ответы, как представляется, в результате запуска моего for()
loop на unsorted data.frame.
Я добавил код arrange
df на IndID
и теперь получаю те же ответы, что и вы.
library(plyr)
set.seed(123)
Data <- data.frame(IndID = rep(c("AAA", "BBB", "CCC", "DDD", "EEE"), 20),
UTM_E = sample(482000:509000, 100),
UTM_N = sample(4780000:4810500, 100)
)
Data <- arrange(Data, IndID)
И у меня есть эта таблица, содержащая один Start
места для каждого человека.
set.seed(123)
Start <- data.frame(IndID = c("AAA", "BBB", "CCC", "DDD", "EEE"),
UTM_E = sample(482000:509000, 5),
UTM_N = sample(4780000:4810500, 5)
)
Для каждого уровня IndID Я хочу, чтобы применить следующий расчет, чтобы добавить новый столбец в Data.
Например, когда Data$IndID == Start$IndID
я хочу создать
Data$NewValue = ((((Data$UTM_E - Start$UTM_E)/1000)^2) + (((Data$UTM_N - Start$UTM_N)/1000)^2))
Хотя я знаю, что это возможно с после for()
цикла и кода форматирования, я подозреваю, что существует лучший векторный подход, который был бы намного чище и эффективнее.
Inds <- unique(Data$IndID)
NewValue <- list()
for (i in 1:length(Inds)){
NewValue[[i]] = ((((Data$UTM_E[Data$IndID == Inds[i]] - Start$UTM_E[i])/1000)^2) +
(((Data$UTM_N[Data$IndID == Inds[i]] - Start$UTM_N[i])/1000)^2))
}
Data$NewValue <- c(do.call("cbind",NewValue))
head(Data)
tail(Data)
Любые предложения о том, как «векторизовать» выше for()
петли будут оценены.
Замечание: если вы анализируете движение животных, вы можете взглянуть на пакет adehabitatLT. Очень легко получить базовые показатели из пространственно-временных данных, подобных вашим. См. [виньетка] (https://cran.r-project.org/web/packages/adehabitatLT/vignettes/adehabitatLT.pdf). – Henrik
@ Хенрик. Да, пакет adehabitatLT замечательный, но для текущего проекта предпочтительным является формат объекта ltraj. –