我是一名研究生物学家,对编码比较陌生。我正在清理一个数据集,并自动化一个过程,然后在ArcGIS中使用。我有一个2015年的数据集,大约有10只鸟,我现在用它作为样本年。我正在寻找的最终结果是每个鸟类的csv文件,每个15分钟的GPS点的空间位置,我有一个一对一的连接。我遇到的问题是,数据记录器也有一个潜水记录器,当鸟潜水,但没有具体的GPS坐标潜水。
现在我有点犯难了。我需要将潜水持续时间的条目组合到纬度和长到最取的GPS点,在ArcGIS中创建一个1:1的加入(根据时间的不同,可以是上面的点,也可以是下面的点)。我希望能够创建一个代码,结果如下(可能还有一列有潜水次数的信息)。
BIRD 1 TIME DATE LATITUDE LONGITUDE DIVE DURATION NUMBER OF DIVES(鸟1时间日期纬度长纬度潜水时间)。
是否有一个功能在 dplyr
可以帮助解决这个问题?
任何帮助将是非常感激的
EDIT:我现在的代码。
# Start by connecting to 2015 data
data2015 <- read.csv("GPS data 2015\\GPS2015Birds.csv")
# select out individual logger.ID
i <- "GRE12"
# Now this starts to filter only the information wanted in the final CSV file
birdo <- data2015 %>%
filter(LoggerID== i)
birdie <- birdo %>%
filter(!is.na(Latitude)|Divingduration %in% c(4:120))
这是一些数据的样本 This is a sample of some of the data:
head(birdie)
LoggerID Year Month Day Hour Minute Second Latitude Longitude Divingduration
1 GRE12 2015 6 19 23 38 0 51.03007 -39.78358 NA
2 GRE12 2015 6 21 12 18 0 55.02958 -39.79267 NA
3 GRE12 2015 6 21 12 19 0 45.02962 -39.79262 NA
4 GRE12 2015 6 21 12 19 0 65.02960 -39.79275 NA
5 GRE12 2015 6 21 12 23 0 62.02960 -39.79272 NA
6 GRE12 2015 6 21 12 24 0 23.02960 -39.79257 NA
7 GRE12 2015 6 21 12 24 0 34.02955 -39.79247 NA
8 GRE12 2015 6 21 12 31 0 76.02958 -39.79275 NA
9 GRE12 2015 6 21 12 31 0 61.02960 -39.79267 NA
10 GRE12 2015 6 21 12 32 0 67.02958 -39.79270 NA
11 GRE12 2015 6 21 12 32 0 54.02960 -39.79277 NA
12 GRE12 2015 6 21 12 33 0 98.02963 -39.79272 NA
13 GRE12 2015 6 21 12 37 16 NA NA 24
14 GRE12 2015 6 21 12 48 0 12.03137 -39.79330 NA
15 GRE12 2015 6 21 13 3 0 41.03152 -39.79270 NA
16 GRE12 2015 6 21 13 18 0 98.03187 -39.79252 NA
17 GRE12 2015 6 21 13 33 0 43.03185 -39.79258 NA
18 GRE12 2015 6 21 13 49 0 59.03187 -39.79262 NA
19 GRE12 2015 6 21 14 4 0 38.03245 -39.79222 NA
20 GRE12 2015 6 21 14 19 0 93.03245 -39.79250 NA
21 GRE12 2015 6 21 14 35 0 69.03245 -39.79237 NA
22 GRE12 2015 6 21 14 50 0 32.04337 -39.80202 NA
23 GRE12 2015 6 21 15 5 0 54.05958 -39.88438 NA
24 GRE12 2015 6 21 15 20 0 76.05950 -39.88617 NA
25 GRE12 2015 6 21 15 35 0 23.05945 -39.88620 NA
26 GRE12 2015 6 21 15 51 0 43.05943 -39.88617 NA
27 GRE12 2015 6 21 16 3 16 NA NA 4
28 GRE12 2015 6 21 16 6 0 99.05950 -39.88662 NA
29 GRE12 2015 6 21 16 21 0 63.05517 -39.89503 NA
30 GRE12 2015 6 21 16 33 46 NA NA 4
31 GRE12 2015 6 21 16 34 48 NA NA 6
32 GRE12 2015 6 21 16 37 0 78.04935 -39.90928 NA
33 GRE12 2015 6 21 16 37 42 NA NA 7
这里有一个方法与 fuzzyjoin
包。
首先,让我们把不同的时间组件组合成一个datetime列。
library(lurbidate)
library(dplyr)
birdie <- birdie %>%
mutate(Time = mdy_hms(paste(Month,Day,Year,Hour, Minute, Second))) %>%
select(LoggerID, Latitude, Longitude, Divingduration, Time)
现在,我们将把小鸟的数据分成几组, 有LatLong数据的行,和那些有LatLong数据的行。Divingduration
数据。
然后我们可以使用一个 difference_join
,加入到一定距离内的时间,在课堂上,我用15分钟(60*15
).
在加入完成后,我们可以通过以下方式进行分组 LoggerID.x
并确保 LoggerID
s是相同的,然后过滤时间差最小的行。
最后,我们可以选择我们感兴趣的列。
library(fuzzyjoin)
birdie %>%
filter(!is.na(Latitude)) %>%
difference_inner_join(birdie %>% filter(!is.na(Divingduration)),
by = "Time", max_dist = 60*15) %>%
group_by(LoggerID.x,Time.y) %>%
filter(LoggerID.x == LoggerID.y &
abs(Time.x - Time.y) == min(abs(Time.x - Time.y))) %>%
select(LoggerID.x,Latitude.x,Longitude.x, Time.x, Divingduration.y,Time.y)
# A tibble: 5 x 6
# Groups: LoggerID.x, Time.y [5]
LoggerID.x Latitude.x Longitude.x Time.x Divingduration.y Time.y
<fct> <dbl> <dbl> <dttm> <int> <dttm>
1 GRE12 98.0 -39.8 2015-06-21 12:33:00 24 2015-06-21 12:37:16
2 GRE12 99.1 -39.9 2015-06-21 16:06:00 4 2015-06-21 16:03:16
3 GRE12 78.0 -39.9 2015-06-21 16:37:00 4 2015-06-21 16:33:46
4 GRE12 78.0 -39.9 2015-06-21 16:37:00 6 2015-06-21 16:34:48
5 GRE12 78.0 -39.9 2015-06-21 16:37:00 7 2015-06-21 16:37:42