好吧所以这个问题标题可能听起来很模糊,而且由于我无法确定我想要做什么,所以我很难找到答案..所以这里就是这样。
我正在处理狩猎数据,我需要将年份分成不同的季节。然而,我的季节是由狩猎的位置而不是按日期来定义的。所以基本上在努纳武特杀死的一只鹅是夏天,秋天在加拿大被杀的一只鹅是秋天,在美国被杀的是冬天在加拿大被杀的春天是春天。
我能够获得一个将我的数据集分成基于地理区域的季节的列。
但是,当我尝试为每个场合(或季节)分配一个唯一的号码时,我遇到的问题是,当新的一年切换时,我的场合也会切换,因为我使用了基于年份的计算分配季节数,这显然是错误的方式。我真正想要的是一个冬天(比如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行数据,我无法手工完成。
非常感谢你的帮助,并为那个不那么清晰和非常混乱的问题感到抱歉。
答案 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)
}