2017-02-21 33 views
2

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

Вот кадр выборки данных:

date <- seq(as.POSIXct("2014-07-21 17:00:00", tz= "GMT"), as.POSIXct("2014-09-11 24:00:00", tz= "GMT"), by="hour") 
group <- letters[1:4]       
datereps <- rep(date, length(group))     
attr(datereps, "tzone") <- "GMT" 
sitereps <- rep(group, each = length(date))  
value <- rnorm(length(datereps)) 
df <- data.frame(DateTime = datereps, Group = group, Value = value) 

и вот кадр данных «вырезать» из обрезания восходит использовать:

start <- c("2014-08-01 00:00:00 GMT", "2014-07-26 00:00:00 GMT", "2014-07-21 17:00:00 GMT", "2014-08-03 24:00:00 GMT") 
end <- c("2014-09-11 24:00:00 GMT", "2014-09-01 24:00:00 GMT", "2014-09-07 24:00:00 GMT", "2014-09-11 24:00:00 GMT") 
cut <- data.frame(Group = group, Start = as.POSIXct(start), End = as.POSIXct(end)) 

Я могу сделать это вручную для каждой группы, избавившись от данные я не хочу на обоих концах временных рядов с использованием ![(),]:

df2 <- df[!(df$Group == "a" & df$DateTime > "2014-08-01 00:00:00 GMT" & df$DateTime < "2014-09-11 24:00:00 GMT"),] 

B ut, как я могу автоматизировать это?

ответ

1

Просто соедините разрезы в кадре данных, а затем создайте новый кадр данных, используя новые столбцы, как показано ниже. df3 содержит удаленные записи, df4 содержит сохраненные.

df2 <- merge(x = df,y = cut,by = "Group") 
df3 <- df2[df2$DateTime <= df2$Start | df2$DateTime >= df2$End,] 
df4 <- df2[!(df2$DateTime <= df2$Start | df2$DateTime >= df2$End),] 
+0

Хорошо, что, если вы хотите сделать что-то подобное, но на этот раз вместо того, чтобы удалить данные, только флаг строки, _within_ конкретных дат и время кадр (еще раз задаемся даты начала и окончания)? Я задал новый вопрос здесь. [Создать столбец для флага строк в течение периода времени в R] (http://stackoverflow.com/questions/42516632/create-column-to-flag-rows-within-a-date-period- in-r/42516781 # 42516781) – notacodr

+1

@notacodr В этом коде мы подмножаем фрейм данных, используя вектор действительных и ложных утверждений. Поэтому, если вы хотите создать флаг, который был TRUE, когда что-то внутри диапазона, а FALSE в противном случае, вы можете сделать это: 'df2 $ flagvar <-! (Df2 $ DateTime <= df2 $ Start | df2 $ DateTime> = df2 $ End) ' – TARehman

+0

Да, мне это нравится. Благодаря! – notacodr