2017-02-22 7 views
2

この質問のタイトルは曖昧に聞こえるかもしれません。私は実際に何をしようとしているのかを正確に突き止めることができないので、答えはだからここに行く。年月を基準にしないで機会を定義する(季節別)R

私は狩猟のデータを扱っており、別の季節に年を分ける必要があります。しかし、私の季節は日付ではなく狩猟の場所によって定義されます。だから基本的にヌナブトで殺されたガチョウは夏で、秋にはカナダで死んだガチョウが秋になり、アメリカでは冬が殺され、春にはカナダで死んだのが春です。

地理的エリアに基づいて私のデータセットを季節に分ける列を得ることができました。

ただし、各機会(または季節)に固有の番号を割り当てようとすると、新しい年が切り替わるときに私の機会が切り替わるという問題にぶつかります。シーズン番号を割り当てることができます。これは明らかに間違った方法です。私が実際に望んでいるのは、ある冬(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以上のデータ私は手でこれを行うことはできません。

ご協力いただきありがとうございます。あまりにも明確で非常に面倒な質問をおかけして申し訳ありません。

+1

データベースの問題があるように見えるのと同じようにルールを定義する必要があります。シーズンは国と月ごとに定義され、一意の識別子を割り当てることができます。次に、各「Ring_ID_Month」に与えられたセッションを割り当てるためのセッション情報(テーブル/データフレーム/ファイル)を探してください。私はあなたの問題を非常によく理解しているかどうかはわかりません、何らかの形で、「機会」の意味についての情報を提供し、完全な例を提供してください。 –

答えて

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) 
} 
2

まず最初に行うには、との新しい列を定義することです。そして、あなたはおそらくこれを行うには、より巧妙な方法を見つけることができ

df$date <- as.Date(with(df, paste(Year, Month, Day,sep="-")), "%Y-%m-%d") 

をが、これは動作します:

はちょうど作ろう少しの時間を節約するためにfonctionは: は、あなたが望むすべての開始日と終了日とデータフレームを作ることができます(1990年9月1日(開始)、1991年5月1日(終了))

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 
    } 

ここに行く! :)

バイブレミング:P

+1

うん、うん、うん!ありがとう! –

関連する問題