定义场合(按季节)而不是基于R的年份

时间:2017-02-22 00:27:11

标签: r formatting

好吧所以这个问题标题可能听起来很模糊,而且由于我无法确定我想要做什么,所以我很难找到答案..所以这里就是这样。

我正在处理狩猎数据,我需要将年份分成不同的季节。然而,我的季节是由狩猎的位置而不是按日期来定义的。所以基本上在努纳武特杀死的一只鹅是夏天,秋天在加拿大被杀的一只鹅是秋天,在美国被杀的是冬天在加拿大被杀的春天是春天。

我能够获得一个将我的数据集分成基于地理区域的季节的列。

但是,当我尝试为每个场合(或季节)分配一个唯一的号码时,我遇到的问题是,当新的一年切换时,我的场合也会切换,因为我使用了基于年份的计算分配季节数,这显然是错误的方式。我真正想要的是一个冬天(比如9月到5月)在同一个场合。然而我的问题是我不能用月份作为起点,因为我的季节是按地点而不是数月定义的。

基本上我看起来像这样

    Ring_ID Month   Day Year    region  country     Season  Occasion 
    113749265   7   12  1989    NU          CAN     Summer      2
    113749264   10  19  1989    QC          CAN     Fall        3
    113749268   10  21  1989    QC          CAN     Fall        3
    113753009   10  4   1990    QC          CAN     Fall        7
    113753467   10  6   1990    QC          CAN     Fall        7
    113749752   10  9   1990    Delaware    USA     Winter      8
    113749755   10  9   1990    Delaware    USA     Winter      8
    113753258   10  9   1990    Delaware    USA     Winter      8
    113749628   12  26  1990    Delaware    USA     Winter      8
    113749734   1   7   1991    Delaware    USA     Winter      12
    113749739   1   8   1991    Delaware    USA     Winter      12

注意最后4行?我需要在1990-1991冬季场合留在8而不要切换到12.但我也需要将1991-1992冬季的场合显示为12。

显然,对于27年和超过18k行数据,我无法手工完成。

非常感谢你的帮助,并为那个不那么清晰和非常混乱的问题感到抱歉。

2 个答案:

答案 0 :(得分:2)

要做的第一件事是使用:

定义一个新列
  df$date <- as.Date(with(df, paste(Year, Month, Day,sep="-")), "%Y-%m-%d")

然后你可能会找到一种更聪明的方法来做到这一点,但这可行:

让我们来节省一点时间: 让我们创建一个包含你想要的所有开始和结束日期的数据框(1990-09-01(开始),1991-05-01(结束))

EX:

    sub<- data.frame(start=as.Date(c("1990-09-01","1991-09-01","1992-09-01")), end=as.Date(c("1991-06-01","1992-06-01","1993-06-01")))


### This function subset the data between two date
 myfunc <- function(x,y,df){

     df[df$date >= x & df$date <= y,]
 }

### I use a for loop to get the Occasion associate with the iteration
data.list=list()
for (i in length(sub$start)){
dat <- myfunc(sub$start[i],sub$end[i],df)   
dat$Occasion<- i
data.list[[i]] <- dat
   }

你走了! :)

Vive les lemmings:P

答案 1 :(得分:1)

这可能会好一点!

make.occasion<-function(datelist,data){
dat <- list()
names(datelist)[1]<-"start"   
names(datelist)[2]<-"end"
for (i in 1:length(datelist$start)){
Occ<-data[data$date >= datelist$start & data$date <= datelist$end,]
Occ$Occasion<-i
dat<-rbind(dat,Occ)
}
    return(dat)
}