首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定义时机(按季节),而不以R中的年份为基础

定义时机(按季节),而不以R中的年份为基础
EN

Stack Overflow用户
提问于 2017-02-22 08:27:11
回答 2查看 78关注 0票数 2

好的,这个问题的标题可能听起来很模糊,因为我不能准确地指出我想要做什么,所以我很难找到答案。这样就可以了。

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

我能够获得一个列,根据地理区域将我的数据集划分为不同的季节。

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

基本上,我得到的是这样的

代码语言:javascript
复制
    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行的数据,我不能手工完成这项工作。

非常感谢你的帮助,并为不太清楚和非常混乱的问题道歉。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-27 12:54:21

这可能会更好一点!

代码语言:javascript
复制
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)
}
票数 1
EN

Stack Overflow用户

发布于 2017-02-22 13:39:50

要做的第一件事是使用定义一个新列:

代码语言:javascript
复制
  df$date <- as.Date(with(df, paste(Year, Month, Day,sep="-")), "%Y-%m-%d")

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

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

例如:

代码语言:javascript
复制
    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万岁

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42380538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档