在R中把另一行的数据追加到上面或下面的行条目中?

问题描述 投票:1回答:1

我是一名研究生物学家,对编码比较陌生。我正在清理一个数据集,并自动化一个过程,然后在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
r dplyr arcgis dataformat
1个回答
0
投票

这里有一个方法与 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 并确保 LoggerIDs是相同的,然后过滤时间差最小的行。

最后,我们可以选择我们感兴趣的列。

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
© www.soinside.com 2019 - 2024. All rights reserved.