【问题标题】:Subsetting data by multiple date ranges - R按多个日期范围对数据进行子集 - R
【发布时间】:2016-04-01 13:02:33
【问题描述】:

我会直截了当:我收到了一些 .csv 格式的数据集,其中包含来自机器的定期记录的传感器数据。但是,此数据集还包含机器关闭时进行的测量,我想将其与打开时记录的数据分开。为了对相关数据进行子集化,我还有一个包含这些关闭的开始和结束时间的文件。这个文件有几百行长。

此问题的相关文件示例:

file: sensor_data.csv

sens_name,time,measurement
sens_A,17/12/11 06:45,32.3321
sens_A,17/12/11 08:01,36.1290
sens_B,17/12/11 05:32,17.1122
sens_B,18/12/11 03:43,12.3189

##################################################

file: shutdowns.csv

shutdown_start,shutdown_end
17/12/11 07:46,17/12/11 08:23
17/12/11 08:23,17/12/11 09:00
17/12/11 09:00,17/12/11 13:30
18/12/11 01:42,18/12/11 07:43

为了对 R 中的数据进行子集化,我之前曾使用 subset() 函数和简单的条件,效果很好,但我不知道如何对超出多个关闭日期范围的传感器数据进行子集化。我已经使用as.POSIXlt() 格式化了日期和时间数据。

我怀疑可能会涉及到一些脚本来提出一个好的解决方案,但恐怕我还没有足够的经验来处理这种类型的数据。

我们将不胜感激任何帮助、建议或解决方案。让我知道是否还有其他需要解决的问题。

【问题讨论】:

    标签: r subset


    【解决方案1】:

    我更喜欢 POSIXct 格式的数据框内的范围。我们使用t < shutdown_start OR t > shutdown_end 为停机期间运行的传感器创建一个索引。有了这些范围,我们就可以根据需要对数据进行子集化:

    posixct <- function(x) as.POSIXct(x, format="%d/%m/%y %H:%M")
    
    sensor_data$time <- posixct(sensor_data$time)
    shutdowns[] <- lapply(shutdowns, posixct)
    
    ind1 <- sapply(sensor_data$time, function(t) {
      sum(t < shutdowns[,1] | t > shutdowns[,2]) == length(sensor_data$time)})
    
    #Measurements taken when shutdown
    sensor_data[ind1,]
    #   sens_name                time measurement
    # 1    sens_A 2011-12-17 06:45:00     32.3321
    # 3    sens_B 2011-12-17 05:32:00     17.1122
    
    #Measurements taken when not shutdown
    sensor_data[!ind1,]
    #   sens_name                time measurement
    # 2    sens_A 2011-12-17 08:01:00     36.1290
    # 4    sens_B 2011-12-18 03:43:00     12.3189
    

    【讨论】:

    • 非常感谢,皮埃尔!我什至从你的代码中学到了一些东西。但是,在完成您的步骤后,我遇到了ind1 的问题。键入 summary(ind1) 表明每一行都被视为 FALSE。我怀疑这与function(t) 内部的“过滤条件”有关,但我自己一直无法找到解决方案。有什么我错过的吗?再次感谢您的宝贵时间。
    • 你好。我仍在努力解决这个问题,并且一直试图理解function(t) 中的sum() 函数的作用。使用sapply(),您可以从sensor_data$time 获取单独的测量时间,然后评估每个测量时间是否满足function(t) 中的条件,对吗? sum() 函数是否有助于查看 sensor_data 时间是否在 any 关闭间隔内?
    • 在函数中使用 sum 是一种计算 TRUE 与 FALSE 数量的方法。试试sum(c(TRUE, FALSE, TRUE)) 看看它是如何添加的。
    • 这可能更容易function(t) all(t &lt; shutdowns[,1] | t &gt; shutdowns[,2])
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    • 2019-01-02
    • 2015-02-11
    • 2017-05-12
    • 2014-04-20
    相关资源
    最近更新 更多