如何创建(在 r 中)基于组的 UTM 位置之间的距离向量?
How do I create (in r) a vector of distances between UTM locations based on group?
我有一个针对不同时间长度定位的个体动物的数据框。每行标识个人(例如 T003、T121 等)、UTM 中的 X 和 Y 坐标以及收集位置的日期。我正在尝试计算每个人每天移动的平均距离,以创建一个矢量用于 individuals/populations 之间的比较。在 r 中执行此操作的最佳方法是什么?
TelemetryID Date Easting Northing
1 T007 9/25/11 739632 3597373
2 T007 8/13/11 739637 3597367
3 T007 8/22/11 739641 3597375
4 T007 9/23/11 739637 3597388
5 T007 8/17/11 739639 3597409
6 T007 9/5/11 739623 3597379
7 T007 8/20/11 739635 3597385
8 T007 9/8/11 739668 3597369
9 T007 8/15/11 739633 3597384
10 T007 9/3/11 739632 3597377
我知道这些不是连续的日期,所以它需要代码函数来识别日历日期关系。
最终目标是移动平均每日距离的向量,以作为列添加到以下数据框
TelemetryID Area Date Sex
1 T001 6.643804e-11 8/10/11 M
2 T002 5.940842e-12 8/7/11 M
3 T003 1.389048e-10 8/10/11 M
4 T004 8.175402e-12 8/7/11 M
5 T005 4.928881e-11 8/9/11 M
6 T006 2.697745e-11 8/10/11 M
7 T007 1.168960e-10 8/10/11 F
输入和输出 table 是不同的,因为输入 table 包括个人位置的每个实例,这些实例将根据函数提炼为可归因于单个位置的平均值个人;平均值将作为建模中的因变量。
result <- SlimBoth %>%
mutate(Date = as.Date(Date, format = "%m/%d/%y")) %>%
arrange(Date) %>%
group_by(TelemetryID) %>%
mutate( Dist = pointDistance(cbind(Easting, Northing),
cbind(lag(Easting), lag(Northing)),
lonlat = FALSE),
Elapsed = as.integer(Date - lag(Date)),
DistPerDay = Dist / Elapsed)
result
result %>%
dplyr::summarise(AveDist = mean(DistPerDay, na.rm = TRUE)) %>%
right_join(Telemetered.1)->ADDM
此函数效果很好,我更新了 telemetered.1 数据框以包含“平均每日移动距离”列。结果 table 在平均移动值应该输入的位置输入了大量“Inf”。
TelemetryID AveDist Date Easting Northing Sex Translocated
<chr> <dbl> <chr> <int> <int> <chr> <chr>
1 T001 Inf 8/10/11 736408 3598539 M No
2 T002 Inf 8/7/11 736529 3598485 M No
3 T003 Inf 8/10/11 736431 3598671 M No
4 T004 Inf 8/7/11 736535 3598673 M No
5 T005 Inf 8/9/11 739641 3597415 M No
6 T006 30.2 8/10/11 735846 3598974 M No
7 T007 Inf 8/10/11 739647 3597146 F No
8 T008 Inf 8/11/11 739797 3597455 M No
9 T009 Inf 8/11/11 729166 3603726 F No
10 T010 Inf 8/11/11 729058 3603703 M No
第一个 df 包括每个人的所有位置实例。我想用平均每日移动距离 (ADDM) 的值来总结每个人的所有这些位置。这将产生 1 value/individual。然后我想将此值添加到另一个 df 以进行建模,其中包括个人 (TelemetryID)、性别、易位状态、ADDM 和家庭范围区域(我为每个人单独计算)。以下是至少在一天内被定位两次的个人的数据:
TelemetryID Date Time Easting Northing Sex Translocated
4969 T237 8/14/13 10:36:00 740968 3597704 M No
4970 T237 8/7/13 10:52:00 740860 3597865 M No
4971 T237 8/13/13 09:49:00 740893 3597835 M No
4972 T237 7/29/13 19:41:00 740872 3597872 M No
4973 T237 8/6/13 10:36:00 741002 3597627 M No
4974 T237 8/17/13 19:13:00 740965 3597710 M No
4975 T237 8/18/13 19:25:00 740964 3597705 M No
4976 T237 8/3/13 10:58:00 740860 3597865 M No
4977 T237 8/5/13 09:20:00 740985 3597695 M No
4978 T237 8/14/13 19:37:00 741005 3597644 M No
4979 T237 7/30/13 10:03:00 740862 3597862 M No
4980 T237 7/31/13 10:37:00 740874 3597862 M No
4981 T237 8/20/13 18:56:00 740916 3597720 M No
4982 T237 8/21/13 05:46:00 741025 3597736 M No
4983 T237 8/27/13 10:07:00 740963 3597828 M No
4984 T237 8/30/13 09:54:00 741019 3597768 M No
4985 T237 9/1/13 11:07:00 740871 3597861 M No
4986 T237 8/28/13 09:51:00 740954 3597626 M No
4987 T237 8/1/13 19:07:00 740880 3597862 M No
一种方法是使用 raster
中的 pointDistance
和 dplyr
中的 lag
:
library(dplyr)
library(raster)
result <- data %>%
mutate(DateTime = as.POSIXct(paste(Date,Time), format = "%m/%d/%y %H:%M:%S")) %>%
dplyr::select(TelemetryID, Sex, Translocated, Easting, Northing, DateTime) %>%
arrange(DateTime) %>%
group_by(TelemetryID) %>%
mutate( Dist = pointDistance(cbind(Easting, Northing),
cbind(lag(Easting), lag(Northing)),
lonlat = FALSE),
Elapsed = as.numeric(difftime(DateTime,lag(DateTime),units = "days")),
DistPerDay = Dist / Elapsed)
result
# TelemetryID Sex Translocated Easting Northing DateTime Dist Elapsed DistPerDay
# <fct> <fct> <fct> <int> <int> <dttm> <dbl> <dbl> <dbl>
# 1 T237 M No 740872 3597872 2013-07-29 19:41:00 NA NA NA
# 2 T237 M No 740862 3597862 2013-07-30 10:03:00 14.1 0.599 23.6
# 3 T237 M No 740874 3597862 2013-07-31 10:37:00 12 1.02 11.7
# 4 T237 M No 740880 3597862 2013-08-01 19:07:00 6 1.35 4.43
# 5 T237 M No 740860 3597865 2013-08-03 10:58:00 20.2 1.66 12.2
# 6 T237 M No 740985 3597695 2013-08-05 09:20:00 211. 1.93 109.
# 7 T237 M No 741002 3597627 2013-08-06 10:36:00 70.1 1.05 66.6
# 8 T237 M No 740860 3597865 2013-08-07 10:52:00 277. 1.01 274.
# 9 T237 M No 740893 3597835 2013-08-13 09:49:00 44.6 5.96 7.49
#10 T237 M No 740968 3597704 2013-08-14 10:36:00 151. 1.03 146.
#11 T237 M No 741005 3597644 2013-08-14 19:37:00 70.5 0.376 188.
#12 T237 M No 740965 3597710 2013-08-17 19:13:00 77.2 2.98 25.9
#13 T237 M No 740964 3597705 2013-08-18 19:25:00 5.10 1.01 5.06
#14 T237 M No 740916 3597720 2013-08-20 18:56:00 50.3 1.98 25.4
#15 T237 M No 741025 3597736 2013-08-21 05:46:00 110. 0.451 244.
#16 T237 M No 740963 3597828 2013-08-27 10:07:00 111. 6.18 17.9
#17 T237 M No 740954 3597626 2013-08-28 09:51:00 202. 0.989 204.
#18 T237 M No 741019 3597768 2013-08-30 09:54:00 156. 2.00 78.0
#19 T237 M No 740871 3597861 2013-09-01 11:07:00 175. 2.05 85.2
现在您可以根据需要汇总数据,例如 mean
,并加入您的其他数据:
result %>%
summarise(AveDist = mean(DistPerDay, na.rm = TRUE)) %>%
right_join(data2)
## A tibble: 7 x 5
# TelemetryID AveDist Area Date Sex
# <fct> <dbl> <dbl> <fct> <fct>
#1 T237 85.0 6.64e-11 8/10/11 M
#2 T002 NA 5.94e-12 8/7/11 M
#3 T003 NA 1.39e-10 8/10/11 M
#4 T004 NA 8.18e-12 8/7/11 M
#5 T005 NA 4.93e-11 8/9/11 M
#6 T006 NA 2.70e-11 8/10/11 M
#7 T007 NA 1.17e-10 8/10/11 F
我有一个针对不同时间长度定位的个体动物的数据框。每行标识个人(例如 T003、T121 等)、UTM 中的 X 和 Y 坐标以及收集位置的日期。我正在尝试计算每个人每天移动的平均距离,以创建一个矢量用于 individuals/populations 之间的比较。在 r 中执行此操作的最佳方法是什么?
TelemetryID Date Easting Northing
1 T007 9/25/11 739632 3597373
2 T007 8/13/11 739637 3597367
3 T007 8/22/11 739641 3597375
4 T007 9/23/11 739637 3597388
5 T007 8/17/11 739639 3597409
6 T007 9/5/11 739623 3597379
7 T007 8/20/11 739635 3597385
8 T007 9/8/11 739668 3597369
9 T007 8/15/11 739633 3597384
10 T007 9/3/11 739632 3597377
我知道这些不是连续的日期,所以它需要代码函数来识别日历日期关系。
最终目标是移动平均每日距离的向量,以作为列添加到以下数据框
TelemetryID Area Date Sex
1 T001 6.643804e-11 8/10/11 M
2 T002 5.940842e-12 8/7/11 M
3 T003 1.389048e-10 8/10/11 M
4 T004 8.175402e-12 8/7/11 M
5 T005 4.928881e-11 8/9/11 M
6 T006 2.697745e-11 8/10/11 M
7 T007 1.168960e-10 8/10/11 F
输入和输出 table 是不同的,因为输入 table 包括个人位置的每个实例,这些实例将根据函数提炼为可归因于单个位置的平均值个人;平均值将作为建模中的因变量。
result <- SlimBoth %>%
mutate(Date = as.Date(Date, format = "%m/%d/%y")) %>%
arrange(Date) %>%
group_by(TelemetryID) %>%
mutate( Dist = pointDistance(cbind(Easting, Northing),
cbind(lag(Easting), lag(Northing)),
lonlat = FALSE),
Elapsed = as.integer(Date - lag(Date)),
DistPerDay = Dist / Elapsed)
result
result %>%
dplyr::summarise(AveDist = mean(DistPerDay, na.rm = TRUE)) %>%
right_join(Telemetered.1)->ADDM
此函数效果很好,我更新了 telemetered.1 数据框以包含“平均每日移动距离”列。结果 table 在平均移动值应该输入的位置输入了大量“Inf”。
TelemetryID AveDist Date Easting Northing Sex Translocated
<chr> <dbl> <chr> <int> <int> <chr> <chr>
1 T001 Inf 8/10/11 736408 3598539 M No
2 T002 Inf 8/7/11 736529 3598485 M No
3 T003 Inf 8/10/11 736431 3598671 M No
4 T004 Inf 8/7/11 736535 3598673 M No
5 T005 Inf 8/9/11 739641 3597415 M No
6 T006 30.2 8/10/11 735846 3598974 M No
7 T007 Inf 8/10/11 739647 3597146 F No
8 T008 Inf 8/11/11 739797 3597455 M No
9 T009 Inf 8/11/11 729166 3603726 F No
10 T010 Inf 8/11/11 729058 3603703 M No
第一个 df 包括每个人的所有位置实例。我想用平均每日移动距离 (ADDM) 的值来总结每个人的所有这些位置。这将产生 1 value/individual。然后我想将此值添加到另一个 df 以进行建模,其中包括个人 (TelemetryID)、性别、易位状态、ADDM 和家庭范围区域(我为每个人单独计算)。以下是至少在一天内被定位两次的个人的数据:
TelemetryID Date Time Easting Northing Sex Translocated
4969 T237 8/14/13 10:36:00 740968 3597704 M No
4970 T237 8/7/13 10:52:00 740860 3597865 M No
4971 T237 8/13/13 09:49:00 740893 3597835 M No
4972 T237 7/29/13 19:41:00 740872 3597872 M No
4973 T237 8/6/13 10:36:00 741002 3597627 M No
4974 T237 8/17/13 19:13:00 740965 3597710 M No
4975 T237 8/18/13 19:25:00 740964 3597705 M No
4976 T237 8/3/13 10:58:00 740860 3597865 M No
4977 T237 8/5/13 09:20:00 740985 3597695 M No
4978 T237 8/14/13 19:37:00 741005 3597644 M No
4979 T237 7/30/13 10:03:00 740862 3597862 M No
4980 T237 7/31/13 10:37:00 740874 3597862 M No
4981 T237 8/20/13 18:56:00 740916 3597720 M No
4982 T237 8/21/13 05:46:00 741025 3597736 M No
4983 T237 8/27/13 10:07:00 740963 3597828 M No
4984 T237 8/30/13 09:54:00 741019 3597768 M No
4985 T237 9/1/13 11:07:00 740871 3597861 M No
4986 T237 8/28/13 09:51:00 740954 3597626 M No
4987 T237 8/1/13 19:07:00 740880 3597862 M No
一种方法是使用 raster
中的 pointDistance
和 dplyr
中的 lag
:
library(dplyr)
library(raster)
result <- data %>%
mutate(DateTime = as.POSIXct(paste(Date,Time), format = "%m/%d/%y %H:%M:%S")) %>%
dplyr::select(TelemetryID, Sex, Translocated, Easting, Northing, DateTime) %>%
arrange(DateTime) %>%
group_by(TelemetryID) %>%
mutate( Dist = pointDistance(cbind(Easting, Northing),
cbind(lag(Easting), lag(Northing)),
lonlat = FALSE),
Elapsed = as.numeric(difftime(DateTime,lag(DateTime),units = "days")),
DistPerDay = Dist / Elapsed)
result
# TelemetryID Sex Translocated Easting Northing DateTime Dist Elapsed DistPerDay
# <fct> <fct> <fct> <int> <int> <dttm> <dbl> <dbl> <dbl>
# 1 T237 M No 740872 3597872 2013-07-29 19:41:00 NA NA NA
# 2 T237 M No 740862 3597862 2013-07-30 10:03:00 14.1 0.599 23.6
# 3 T237 M No 740874 3597862 2013-07-31 10:37:00 12 1.02 11.7
# 4 T237 M No 740880 3597862 2013-08-01 19:07:00 6 1.35 4.43
# 5 T237 M No 740860 3597865 2013-08-03 10:58:00 20.2 1.66 12.2
# 6 T237 M No 740985 3597695 2013-08-05 09:20:00 211. 1.93 109.
# 7 T237 M No 741002 3597627 2013-08-06 10:36:00 70.1 1.05 66.6
# 8 T237 M No 740860 3597865 2013-08-07 10:52:00 277. 1.01 274.
# 9 T237 M No 740893 3597835 2013-08-13 09:49:00 44.6 5.96 7.49
#10 T237 M No 740968 3597704 2013-08-14 10:36:00 151. 1.03 146.
#11 T237 M No 741005 3597644 2013-08-14 19:37:00 70.5 0.376 188.
#12 T237 M No 740965 3597710 2013-08-17 19:13:00 77.2 2.98 25.9
#13 T237 M No 740964 3597705 2013-08-18 19:25:00 5.10 1.01 5.06
#14 T237 M No 740916 3597720 2013-08-20 18:56:00 50.3 1.98 25.4
#15 T237 M No 741025 3597736 2013-08-21 05:46:00 110. 0.451 244.
#16 T237 M No 740963 3597828 2013-08-27 10:07:00 111. 6.18 17.9
#17 T237 M No 740954 3597626 2013-08-28 09:51:00 202. 0.989 204.
#18 T237 M No 741019 3597768 2013-08-30 09:54:00 156. 2.00 78.0
#19 T237 M No 740871 3597861 2013-09-01 11:07:00 175. 2.05 85.2
现在您可以根据需要汇总数据,例如 mean
,并加入您的其他数据:
result %>%
summarise(AveDist = mean(DistPerDay, na.rm = TRUE)) %>%
right_join(data2)
## A tibble: 7 x 5
# TelemetryID AveDist Area Date Sex
# <fct> <dbl> <dbl> <fct> <fct>
#1 T237 85.0 6.64e-11 8/10/11 M
#2 T002 NA 5.94e-12 8/7/11 M
#3 T003 NA 1.39e-10 8/10/11 M
#4 T004 NA 8.18e-12 8/7/11 M
#5 T005 NA 4.93e-11 8/9/11 M
#6 T006 NA 2.70e-11 8/10/11 M
#7 T007 NA 1.17e-10 8/10/11 F