2016-04-20 2 views
2

Мне нужно отфильтровать данные временных рядов на основе групп. Однако фильтрация должна выполняться в начале (-5 минут) и в конце каждой группы (-2 минуты), это означает, что я хотел бы удалить строки в начале (-5 минут) и заканчивать (-2 минуты) каждого группа.R Фильтрация данных временных рядов для каждой группы

Вот пример кода:

Time <- c("2015-08-21T10:00:51", "2015-08-21T10:02:51", "2015-08-21T10:04:51", "2015-08-21T10:06:51", 
      "2015-08-21T10:08:51", "2015-08-21T10:10:51","2015-08-21T10:12:51", "2015-08-21T10:14:51", 
      "2015-08-21T10:16:51", "2015-08-21T10:18:51", "2015-08-21T10:20:51", "2015-08-21T10:22:51") 
x <- c(38.855, 38.664, 40.386, 40.386, 40.195, 40.386, 40.386, 40.195, 40.386, 38.855, 38.664, 40.386) 
y <- c("a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b") 
data <- data.frame(Time,x,y) 
data$Time <- as.POSIXct(data$Time, format = "%Y-%m-%dT%H:%M:%S") 

Y столбцы показывают нам группы, которые в данном конкретном случае является и б

Так для этого примера я бы удалить 3 первые строки и 2 последние строки для уровня a, для одной и той же вещи (в моих исходных данных это будет не так просто удалить в соответствии с количеством строк). Так что я хотел бы получить в конце что-то вроде этого:

    Time  x y 
4 2015-08-21 10:06:51 40.386 a 
10 2015-08-21 10:18:51 38.855 b 

Я хочу отметить, что это только выборочные данные!

Спасибо за помощь!

Я предпочел бы фильтровать данные на основе столбца времени, а не числа строк, мои исходные данные не так хорошо структурированы, как этот, и количество строк в каждой группе различается.

+0

Можете ли вы объяснить, что означает, что «фильтрация должна выполняться в начале (-5 минут) и конце каждой группы (-2 минуты)»? – StrikeR

+0

Эй, я только что объяснил это лучше в своем посте –

ответ

1

Как насчет этого? Разделите data.frame, найдите первые пять и последние две минуты, выполните несколько логических поисков строк и выведите результат.

xy <- split(data, data$y) 

xy <- lapply(xy, FUN = function(m) { 
    m[(m$Time > min(m$Time) + (5 * 60)) & ((max(m$Time) - (2 * 60)) > m$Time), ] 
}) 

do.call("rbind", xy) 

        Time  x y 
a 2015-08-21 10:06:51 40.386 a 
b 2015-08-21 10:18:51 38.855 b 

Я понимаю, что это круто в эти дни также представить dplyr решение. Так вот оно.

library(dplyr) 

data %>% 
    group_by(y) %>% 
    filter((Time > (min(Time) + (5*60))) & (max(Time) - (2*60) > Time)) 
+0

Спасибо, что интересно с 'dplyr'. Как я могу удалить эти выбранные строки из данных? –

+1

Я думаю, что @Roman еще не видел редактирование, но все, что вам нужно сделать, это изменить 3 строки кода в 'lapply' выше на следующее:' m [(m $ Time> = min (m $ Time) + (5 * 60)) & ((max (m $ Time) - (2 * 60))> = m $ Time),] ' – StrikeR

+1

или изменить' filter' в коде 'dplyr' на следующий:' filter ((Time> = (min (Time) + (5 * 60))) & (max (Time) - (2 * 60)> = Time)) ' – StrikeR

Смежные вопросы