按多个日期范围子集数据 - R

时间:2016-04-01 13:02:34

标签: r subset

我会直截了当地说:我已经获得了一些.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()格式化了日期和时间数据。

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

非常感谢任何帮助,建议或解决方案。如果解决方案还有其他任何需要,请告诉我。

1 个答案:

答案 0 :(得分: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