根据不同的日期要求过滤行

时间:2016-04-14 12:03:30

标签: r date dataframe

我有一个包含三列的数据框,包括网站ID,样本日期和测量值。这是一个理论数据集。

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")

我正在筛选出与某些标准不符的特定样本。

首先,我想只选择春季和秋季的样品。所以我想在3月到5月和9月到11月之间选择网站,这意味着数据框中的第一行将被删除。有没有比以下更好的方法:

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)

这样可行,但如果我有几年的样本,我不知道如何快速创建一个序列来匹配这个。

其次,我不希望在特定季节内来自特定网站的两个样本(即我不想要任何重复样本),这意味着数据框中的最后一行将被删除。我不知道如何从这个开始。

2 个答案:

答案 0 :(得分:2)

一种选择是使用months函数进行子集化:

 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)

这将允许在多年内选择相同的月份。

答案 1 :(得分:1)

对于第一个问题,您可以为您的月份创建一个列(独立于年份)并选择该列(此处转换为数字,但您也可以保留普通单词选择) 。 对于第二个问题,您可以使用disctinct

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