【发布时间】:2018-04-26 20:26:12
【问题描述】:
我有一个数据框,其中包含被 GPS 项圈跟踪的个人。为了检查这些人是独立在那里运动还是相互跟随,我想将一个人的每个点(每一行)与围绕第一个点每隔 12 小时间隔的其他人的每个点相关联,然后计算例如,它们之间的距离小于 100 m。
我的数据框:Data_real
'data.frame': 57471 obs. of 7 variables:
$ Elephant : Factor w/ 17 levels "Bull","Bull (one tusk)",..: 1 1 1 1 1
$ Date.time : POSIXct, format: "2015-10-06 14:38:00" "2015-10-06 18:37:00" "2015-10-06 22:37:00" "2015-10-07 02:37:00" ...
$ Date : POSIXct, format: "2015-10-06" "2015-10-06"
$ Date_month : chr "2015-10" "2015-10" "2015-10" "2015-10" ...
$ Date.time_plus6h : POSIXct, format: "2015-10-06 20:38:00" "2015-10-07
$ Date.time_minus6h: POSIXct, format: "2015-10-06 08:38:00" "2015-10-06
$ coords.x1 : num 329468 329393 328341 327563 327271 ...
$ coords.x1.1 : num 329468 329393 328341 327563 327271 ...
Elephant Date.time coords.x1 coords.x1.1 Date_month Date.time_plus6h Date.time_minus6h
0 Bull 2015-10-06 14:38:00 329467.6 329467.6 2015-10 2015-10-06 20:38:00 2015-10-06 08:38:00
1 Bull 2015-10-06 18:37:00 329392.5 329392.5 2015-10 2015-10-07 00:37:00 2015-10-06 12:37:00
2 Bull 2015-10-06 22:37:00 328341.3 328341.3 2015-10 2015-10-07 04:37:00 2015-10-06 16:37:00
3 Bull 2015-10-07 02:37:00 327562.9 327562.9 2015-10 2015-10-07 08:37:00 2015-10-06 20:37:00
4 Bull 2015-10-07 06:37:00 327271.0 327271.0 2015-10 2015-10-07 12:37:00 2015-10-07 00:37:00
5 Bull 2015-10-07 14:38:00 322977.5 322977.5 2015-10 2015-10-07 20:38:00 2015-10-07 08:38:00
起初,我试图通过 Date 来 inner_join ,然后计算每个已连接的点之间的距离。
Association<-NA
for (id in unique(Data_real$Elephant)) {
id1<-Data_real[Data_real$Elephant == id,] #one individual
id2<-Data_real[Data_real$Elephant != id,] #all the others
all.id<-inner_join(id2,id1,by="Date")
deltaX<-(all.id$coords.x2.y - all.id$coords.x2.x) ^ 2
deltaY<-(all.id$coords.x1.y - all.id$coords.x1.x) ^ 2
all.id$distance<-sqrt (deltaX + deltaY) #distance in meters
Association1<-rbind(Association1, all.id)
Data_real<-Data_real[Data_real$Elephant != id,]
}
这样的问题是,如果一个人在 23h55 有一个点,它可能与第二天的点比同一天的点更相关,这就是为什么我想使用每个点周围的时间间隔来消除这种偏见。我搜索,我认为加入功能不能做到这一点。在这个论坛的另一个问题上,他们建议使用过滤器,我对我的数据进行了尝试。它也不是完美的,因为月份的开始和结束时的点关联可能会出现偏差,但它比按天好...
all.id<-inner_join(id2,id1,by="Date_month")
all.id<-as_tibble(all.id)
all.id2<-filter(all.id,Date.time.y >= Date.time_moins6.x & Date.time.y <=
Date.time_plus6.x)
主要问题是该命令似乎无法按照我的编码方式运行,或者完成时间太长。
我在不同的论坛上阅读,我发现 data.table 包中的函数可能对我有用,但我仍然不明白它是如何进行的,我不确定它是否适用于同一种操作。
所以我的问题是:您现在是否是一种连接两个数据框的好方法,您希望将一个人的每个点与第一点时间前后 +6/-6 小时的所有其他人的每个点相关联?如果可能,不要像我尝试的那样,因为我们在月底和月初仍然有偏差值。
提前感谢您的帮助! :)
【问题讨论】:
-
你看到这个问题了吗:stackoverflow.com/questions/25815032/…
-
谢谢!没看到这个问题!它适用于我的数据!