繁体   English   中英

如何使用 R 中分组列的“最近时间”来加入小标题/数据帧?

[英]How to join tibbles/dataframes by using the 'nearest time' of a grouping column in R?

我在下面举例说明了这个数据集:

library(lubridate)
library(tidyverse)

id <- c("A", "A", "B", "B")
date <- ymd(c("2017-11-26", "2017-11-26", "2017-11-26", "2017-11-29"))
time <- hms(c("09:25:30", "10:10:02", "09:15:36", "9:50:55"))
variable1 <- c("67", "30", "28", "90")
df <- tibble(id, date, time, variable1)
df

A tibble: 4 x 4
  id    date       time       variable1
  <chr> <date>     <Period>   <chr>    
1  A     2017-11-26 9H 25M 30S 67       
2  A     2017-11-26 10H 10M 2S 30       
3  B     2017-11-26 9H 15M 36S 28       
4  B     2017-11-29 9H 50M 55S 90   

我需要基于第二个数据集为该数据集中的每一行添加两个新变量(纬度和经度),使用列“id”、“date”和“time”作为创建新列的条件。

但是,两个数据集之间的“时间”并不完全相同,因此我需要这个条件是一个近似值(即给定“id”和“日期”可用的最接近的“时间”)。 另一个问题是第二个数据集有更多行,因此,通过选择“最近时间”,添加到第一个数据集时会忽略一些行。

请参阅此示例以获取第二个数据集:

id <- c("A", "A", "A", "B", "B", "B")
date <- ymd(c("2017-11-26", "2017-11-26", "2017-11-30", "2017-11-26",         
"2017-11-26", "2017-11-29"))
time <- hms(c("09:00:00", "10:00:00", "08:00:00", "09:00:00", 
"13:00:00", "10:00:00"))
lat <- c(-30.6456, -29.5648, -27.6667, -31.5587, -30.6934, -29.3147)
long <- c(-50.4879, -49.8715, -51.8716, -50.4456, -50.9842, -51.9787)
df2 <- tibble(id, date, time, lat, long)
df2

# A tibble: 6 x 5
 id    date       time        lat  long
 <chr> <date>     <Period>  <dbl> <dbl>
1  A   2017-11-26 9H 0M 0S  -30.6 -50.5
2  A   2017-11-26 10H 0M 0S -29.6 -49.9
3  A   2017-11-30 8H 0M 0S  -27.7 -51.9
4  B   2017-11-26 9H 0M 0S  -31.6 -50.4
5  B   2017-11-26 13H 0M 0S -30.7 -51.0
6  B   2017-11-29 10H 0M 0S -29.3 -52.0  

因此,我首先需要按“id”分组,然后按“日期”分组,然后将数据集 2 中的“lat”和“long”提取为数据集 1 中最近的“时间”,在数据集 1。

生成的数据集如下所示:

df_output
# A tibble: 4 x 6
  id    date       time       variable1   lat  long
 <chr> <date>     <Period>   <chr>     <dbl> <dbl>
1  A    2017-11-26 9H 25M 30S 31.5      -30.6 -50.5
2  A    2017-11-26 10H 10M 2S 27.1      -29.6 -49.9
3  B    2017-11-26 9H 15M 36S 45.3      -31.6 -50.4
4  B    2017-11-29 9H 50M 55S 38.4      -29.3 -52.0

我已经尝试过 group_by()、map2_dfr()、merge()、left_join()、case_when() 等。但找不到如何做到这一点。

您可以使用data.table类的

library(data.table)
df <- df %>%
  mutate(time = paste(date, time) %>% ymd_hms()) %>%
  select(-date)
df2 <- df2 %>%
  mutate(time = paste(date, time) %>% ymd_hms()) %>%
  select(-date)


df <- data.table(df, key = c("id", "time"))
df2 <- data.table(df2, key = c("id", "time"))
df2[df, list(id, time, variable1, lat, long), roll = "nearest"]

   id                time variable1      lat     long
1:  A 2017-11-26 09:25:30        67 -30.6456 -50.4879
2:  A 2017-11-26 10:10:02        30 -29.5648 -49.8715
3:  B 2017-11-26 09:15:36        28 -31.5587 -50.4456
4:  B 2017-11-29 09:50:55        90 -29.3147 -51.9787

我不确定variable1的状况,为什么在您的问题中dfdf_output有所不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM