首页 > 解决方案 > 根据来自其他数据帧的时间序列间隔分配新的分组变量

问题描述

我是 R 的相对新手,正在努力解决以下问题。我有一个数据框,其中有一列每秒测量的二氧化碳浓度,一列带有日期时间(POSIXct),第二个数据框带有“开始”和“停止”日期时间。我想做的是在新列中为数据帧分配一个分组变量(例如升序数字),其中 CO2 浓度基于第二个数据帧的开始/停止时间。

例如:开始 = 13:30 停止=13:33,因此所有测得的 CO2 浓度如果处于开始/停止时间之间,就会得到分组变量“1”。

由于开始/停止时间的第一行和第二行之间存在时间,因此还有许多 CO2 测量值应将“NA”作为分组变量。

这是开始/停止数据的子集:

times <- structure(list(Start = structure(c(1591266360, 1591266960), class = c("POSIXct",  "POSIXt"), tzone = ""), Stop = structure(c(1591266540, 1591267140 ), class = c("POSIXct", "POSIXt"), tzone = "")), row.names = 1:2, class = "data.frame")

由于 CO2 浓度的数据框相当大,我将输出放在一个文本文件中: CO2 数据框子集

这是第一次在这里提问(因为我之前的大部分问题都已经问过了),所以如果事情不清楚,我提前道歉。

标签: r

解决方案


根据我在评论中留下的链接,这是您的解决方案。

您的数据:

times <- structure(list(Start = structure(c(1591266360, 1591266960), class = c("POSIXct",  "POSIXt"), tzone = ""), Stop = structure(c(1591266540, 1591267140 ), class = c("POSIXct", "POSIXt"), tzone = "")), row.names = 1:2, class = "data.frame")
df <- eval(parse("df.text"))

解决方案:

library(dplyr)
library(fuzzyjoin)

# define a group per each row before joining
times <- times %>%
  mutate(group = row_number())


# fuzzy join! 
fuzzy_left_join(
  df, times,
  by = c("dt" = "Start", "dt" = "Stop"),
  match_fun = list(`>=`, `<=`)  # here you specify what function to use for the join!
)

fuzzyjoin看起来很酷的包。它允许你做这种dplyr缺乏的特殊连接。


推荐阅读