【问题标题】:Filter data based on date/time range and matching id根据日期/时间范围和匹配 id 过滤数据
【发布时间】:2021-02-11 15:13:40
【问题描述】:

我正在尝试根据日期/时间范围(开始和结束时间)以及来自另一个数据集的每一行的 ID 过滤数据集。最终结果应该是过滤后的数据帧列表。

下面是创建这两个数据集的代码。

#This is the dataset to filter 
x <- as.data.frame(format(seq.POSIXt(as.POSIXct("2019-01-01 07:00"), as.POSIXct("2019-01-01 11:50"), by = "10 min"))) #date/time
y <- as.data.frame(format(seq.POSIXt(as.POSIXct("2019-01-01 07:00"), as.POSIXct("2019-01-01 11:50"), by = "10 min"))) #date/time

datetime <- rbind(list(x,y))
datetime <- do.call(rbind, datetime)
datetime <- rename(datetime, datetime=`format(seq.POSIXt(as.POSIXct("2019-01-01 07:00"), as.POSIXct("2019-01-01 11:50"), by = "10 min"))`)
datetime

values <- c(1:60) #value 
id <- vector(mode="character", length=60)
#id <- rep(letters[1:5], 6) #id 

dataloggers <- data.frame(datetime, values, id)
head(dataloggers)

dataloggers[c(1:10), 3] ="a"
dataloggers[c(11:30), 3]="b"
dataloggers[c(31:60), 3]="c"

dataloggers$datetime <- ymd_hms(dataloggers$datetime)

#and this is the dataset used to filter the dataset above 
starttime <- as.POSIXct(c("2019-01-01 07:00", "2019-01-01 08:40", "2019-01-01 07:00:00"))
starttime <- ymd_hms(starttime)
datetime <- as.POSIXct(c("2019-01-01 08:00", "2019-01-01 10:00", "2019-01-01 08:00"))
datetime <- ymd_hms(datetime)
id <- rep(letters[1:3])
data<- data.frame(starttime,datetime, id)

我已经设法使用for() 循环来过滤日期/时间范围:

my_list <- list() #create empty list
for(i in seq_along(data$starttime)) {
 output <-  dataloggers %>% 
    filter(between(dataloggers$datetime, data$starttime[i], data$datetime[i])) 
  my_list[[i]] <- output
}

my_list <- do.call(rbind, my_list)
my_list

但如您所见,它仅根据开始和结束时间过滤数据框。我还需要它根据匹配的 id 过滤它。 left_join() 没有给我我想要的,因为我不想合并数据集。我只想有一个基于这两个条件的过滤数据框列表。任何帮助将不胜感激。

【问题讨论】:

    标签: r list filtering


    【解决方案1】:

    这里有两种方法:

    1. 基于范围的模糊连接:
    fuzzyjoin::fuzzy_inner_join(dataloggers, data, 
                   by = c('id', 'datetime' = 'starttime', 'datetime'), 
                   match_fun = list(`==`, `>=`, `<=`))
    
    1. id 加入并保持数据在范围内 -

      一个。 dplyr

    library(dplyr)
    dataloggers %>%
      inner_join(data, by = 'id') %>%
      filter(datetime.x >= starttime & datetime.x <= datetime.y)
    

    b.基数:

    subset(merge(dataloggers, data, by = 'id'), 
           datetime.x >= starttime & datetime.x <= datetime.y)
    

    【讨论】:

    • 哦耶,我得到了一枚铜牌!事情正在好转!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 2016-11-25
    • 2020-02-15
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多