将数据从另一行追加到R中的上一行或下一行?

我是一位研究生物学家,在编码方面相对较新。我正在清理数据集并自动化流程,然后在ArcGIS中使用。我有一个2015年的数据集,目前大约有10只鸟用作样本年。我寻找的最终结果是每只鸟的csv文件,并且每15分钟GPS点到我所拥有的空间位置都具有一对一的连接。我遇到的问题是,数据记录器还具有潜水记录器,可用于鸟类潜水的时间,但是没有潜水专用的GPS坐标。

现在我有点卡住了。我需要将潜水持续时间条目合并到经纬度,并一直延伸到最常使用的GPS点,以在ArcGIS中创建1:1联接(上方或下方的点取决于计时)。我希望能够创建一个导致以下结果的代码(可能还有另一列包含有关潜水次数的信息):

BIRD 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
iCMS 回答:将数据从另一行追加到R中的上一行或下一行?

以下是使用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)

现在,我们将小鸟数据分为集合,具有纬度/经度数据的行和具有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:42
本文链接:https://www.f2er.com/2144442.html

大家都在问