【发布时间】:2015-08-20 20:25:41
【问题描述】:
我有这个可重复的 data.frame 代表五个人 (IndID) 的 UTM 位置,每个人都有 20 个位置
编辑:不同的答案似乎是由于在未排序的data.frame. 上运行我的for() 循环我已将代码添加到arrange IndID 的df,现在得到相同的结果像你一样回答。
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包。很容易从像你这样的时空数据中获取基本指标。参见例如the vignette. -
@Henrik。是的,adehabitatLT 包很棒,但对于当前项目,最好使用 ltraj 对象格式。
标签: r for-loop vectorization