2016-04-14 4 views
1

У меня есть блок данных с тремя столбцами, состоящими из идентификатора сайта, даты выборки и измеренного значения. Вот теоретический набор данных.Фильтрация строк на основе разных заданий даты

Dates <- data.frame(c(as.Date("2008-7-1"), 
rep(as.Date("2008-3-1"), times = 4) , 
       rep(as.Date("2008-9-1"), times = 4), 
       as.Date("2008-9-8"))) 
Sites <- as.data.frame(as.factor(c("Site1",rep(c("Site1","Site2","Site3","Site4"), 2), 
       "Site1"))) 
Values <- data.frame(matrix(sample(0:50, 5*2, replace=TRUE), ncol=1)) 
Dataframe <- cbind(Dates,Sites,Values) 
colnames(Dataframe) <- c("date","site","value") 

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

Во-первых, я хотел бы выбрать только весенние и осенние образцы. Поэтому я хотел бы выбрать сайты в период с марта по май и сентябрь-ноябрь, что означает, что первая строка в фреймворке будет удалена. Есть ли лучший способ, чем следующее:

library(dplyr) 
Season_sequence <- c(seq(as.Date("2008-3-1"), 
        as.Date("2008-5-31"), by="days"), 
       seq(as.Date("2008-9-1"), 
        as.Date("2008-11-30"), by="days")) 

`%datein%` <- function(x,y) (x %in% y) 

Season_removed <- Dataframe %>% 
filter(date %datein% Season_sequence) 

Это работает, но если у меня есть образцы в течение нескольких лет, я не знаю, как быстро создать последовательность, чтобы соответствовать этому.

Во-второй, я не хочу два образца с определенным сайта в течение определенного сезона (то есть я не хочу повторить любую пробу), а это означает, что последняя строка в dataframe будет удалена. Я не уверен, как начать с этого.

ответ

1

Для проблема, вы можете создать столбец для своего месяца (независимо от года) и выбрать на нем (здесь, преобразованный в числовой, но вы также можете сохранить простой выбор слов). Для второй проблемы, вы можете использовать disctinct:.

Dataframe %>% 
    mutate(month = as.numeric(format(date, '%m'))) %>% 
    filter(month %in% c(3,4,5,9,10,11)) %>% 
    distinct(month, site) 
+0

Спасибо. Это великолепно и очень близко! Но вместо того, чтобы каждый сайт отличался, существует ли способ создания идентификатора комбинации сайтов/сезонов и использования для этого конкретного? То есть Я хотел бы сохранить образец весны и осени для всех сайтов. –

+0

Просто поправил это ;-) Лучше? – ztl

+0

Прекрасное спасибо! –

2

Одним из вариантов является использование функции месяца для подмножества:

library(dplyr) 
`%datein%` <- function(x,y) (x %in% y) 
seasons<-c("March", "April", "May", "September", "October", "November") 
Season <- Dataframe %>% 
filter(months(Dataframe$date) %datein% seasons) 

Это позволит выбрать тот же месяц (ев) через несколько лет.

+0

Спасибо за это, я только что отредактировал это так, что строки будут удалены на основе месяцев функционирования вы положили в –