我是一名研究生物学家,在编码方面相对较新。我正在清理一个数据集,并自动化一个过程,然后在ArcGIS中使用。我有一个2015年的数据集,大约有10只鸟,我现在正在使用它作为样本年。我正在寻找的最终结果是每只鸟的csv文件,与每个15分钟的GPS点到我的空间位置的一对一连接。我遇到的问题是,数据记录器也有一个潜水记录器,当鸟潜水时,但没有具体的GPS坐标潜水。
现在我有点卡住了。我需要将潜水持续时间条目组合到最晚和最长的GPS点,以在ArcGIS中创建一个1:1的连接(根据时间的不同,可以是上面的点或下面的点)。我希望能够创建一个代码,结果如下(可能有另一个专栏,其中包含潜水次数的信息):
鸟1时间日期纬度经度潜水持续时间潜水次数
dplyr中有没有一个特性可以帮助你做到这一点?
任何帮助都将不胜感激!
编辑:我当前的代码:
# 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))以下是一些数据的示例:
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发布于 2020-06-13 04:18:35
以下是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)现在,我们将小鸟数据分成to集合、具有经纬度/经度数据的行和具有Divingduration数据的行。
然后我们可以用一个difference_join,来连接一定距离内的时间,在课上,我用了15分钟(60*15)。
连接完成后,我们可以按LoggerID.x进行分组,并确保LoggerID相同,然后筛选时间差最小的行。
最后,我们可以选择我们感兴趣的列。
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:42https://stackoverflow.com/questions/62350893
复制相似问题