好的,这个问题的标题可能听起来很模糊,因为我不能准确地指出我想要做什么,所以我很难找到答案。这样就可以了。
我正在处理狩猎数据,我需要将年份分成不同的季节。然而,我的季节是由打猎的地点而不是日期来定义的。所以基本上来说,在努纳武特被杀的鹅是夏天,在加拿大被杀的鹅在秋天是秋天,在美国被杀的鹅是冬天,在加拿大被杀的春天是春天。
我能够获得一个列,根据地理区域将我的数据集划分为不同的季节。
然而,当我试图为每个场合(或季节)分配一个唯一的号码时,我遇到了一个问题,当新年切换时,我的场合也会切换,因为我使用了基于年份的计算来分配季节号码,这显然是错误的方法。我真正想要的是一个冬天(比如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行的数据,我不能手工完成这项工作。
非常感谢你的帮助,并为不太清楚和非常混乱的问题道歉。
发布于 2017-02-27 12:54:21
这可能会更好一点!
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)
}发布于 2017-02-22 13:39:50
要做的第一件事是使用定义一个新列:
df$date <- as.Date(with(df, paste(Year, Month, Day,sep="-")), "%Y-%m-%d")然后你可能会找到一种更聪明的方法来做这件事,但这是可行的:
让我们做一个函数来节省一点时间:让我们做一个包含所有你想要的开始和结束日期的数据帧(1990-09-01(开始),1991-05-01(结束))
例如:
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
}给你!:)
lemmings万岁
https://stackoverflow.com/questions/42380538
复制相似问题