r - 将另一行的数据附加到R中的上方或下方行条目?
问题描述
我是一名研究生物学家,在编码方面相对较新。我正在清理数据集并自动化一个流程,然后在 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
解决方案
这是使用该fuzzyjoin
软件包的一种方法:
首先,让我们将各种时间组件组合到一个日期时间列中:
library(lurbidate)
library(dplyr)
birdie <- birdie %>%
mutate(Time = mdy_hms(paste(Month,Day,Year,Hour, Minute, Second))) %>%
select(LoggerID, Latitude, Longitude, Divingduration, Time)
现在,我们将小鸟数据分为集合、具有纬度/经度数据的行和具有Divingduration
数据的行。
然后我们可以使用difference_join
, 加入一定距离内的时间,在 clase 中,我使用了 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
推荐阅读
- java - MapStruct 无法识别 @Mapping 中的字段 - 简单配置
- python - 有没有更快的方法来应用函数而不是在 python 的循环中使用循环
- python - 如何使用 Scrapy 从 href 选择器中获取干净的 URL?
- python - 为什么 else 语句没有执行?
- scheme - 如何在单独的目录中使用 Chicken Scheme 模块?
- git - prettify 上游运行后如何合并代码
- python-3.x - ImportError:无法导入名称“UsersClient”
- openpgp - 无法使用 OpenPGP.js 对 Excel 文件进行 PGP 加密/解密
- amazon-web-services - AWS 防止盗链的政策
- java - 如何按枚举顺序排序java