2016-04-01 5 views
1

Я сразу пойду: мне были предоставлены некоторые наборы данных в формате .csv, содержащие регулярно регистрируемые данные датчика с машины. Однако этот набор данных также содержит измерения, выполненные при выключении машины, которые я хотел бы отделить от данных, зарегистрированных с момента его включения. Чтобы подмножество соответствующих данных, у меня также есть файл, содержащий начальные и конечные времена этих остановок. Этот файл длиной несколько сотен строк.Подмножество данных по нескольким диапазонам дат - R

Примеры соответствующих файлов для этой проблемы:

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

Я предпочитаю формат 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 
+0

Большое спасибо, Пьер! Я даже узнал кое-что из вашего кода. Однако после выполнения ваших шагов у меня возникают проблемы с 'ind1'. Ввод «summary (ind1)» показывает, что каждая строка была оценена как FALSE. Я подозреваю, что это связано с «условием фильтрации» внутри 'function (t)', но я не смог найти решение самостоятельно. Есть что-то, что я пропустил? Еще раз спасибо за ваше время. – AbuZabi

+0

Еще раз приветствую. Я все еще пытаюсь понять это и застрял в попытке понять роль функции 'sum()' внутри 'function (t)'. С помощью 'sapply()' вы берете отдельные времена измерения из 'sensor_data $ time', а затем оцениваете, выполняет ли каждое условие в' function (t) ', правильно? Помогает ли функция 'sum()' в том, что время sensor_data находится в пределах ** любого интервала отключения? – AbuZabi

+0

Использование 'sum' в функции - это способ подсчета количества ИСТИНЕЙ ИЛИ ЛОЖЬ. Попробуйте 'sum (c (TRUE, FALSE, TRUE))', чтобы увидеть, как он добавляется. –