2017-02-22 27 views
2

Итак, это название вопроса может показаться неопределенным, и поскольку я не могу точно определить, что я пытаюсь сделать, мне трудно найти ответ .. так здесь идет.Определение определённых случаев (по сезонам) без использования его в году в R

Я работаю с данными охоты, и мне нужно отделить годы от разных сезонов. Однако мои сезоны определяются местоположением охоты, а не по дате. Так что в основном гусь убит в Нунавуте летом, гусь, убитая в Канаде осенью, осенью, убитой в США, зимой и убитой в Канаде весной весна.

Мне удалось получить столбец, разделяющий мой набор данных в зависимости от географического региона.

Однако, когда я пытаюсь назначить уникальный номер для каждого случая (или сезона), я сталкиваюсь с проблемой, что, когда новый год переключается, мой случай также переключается, поскольку я использовал расчет, основанный на год, чтобы присвоить номер сезона, что, очевидно, является неправильным способом пойти на него. То, что я действительно хочу, - это одна зима (например, с сентября по май), чтобы остаться в одном и том же случае. Однако моя проблема заключается в том, что я не могу использовать месяцы в качестве отправной точки, поскольку мои сезоны определяются местоположениями, а не месяцами.

В основном то, что у меня есть выглядит следующим образом

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 годами и более 18 тыс. Строк данных Я не могу это сделать вручную.

Большое спасибо за помощь и извините за непростой и очень грязный вопрос.

+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, чтобы сэкономить немного времени: Позволяет сделать dataframe со всей начальной и конечной даты вы хотите (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 ле лемминги: P

+1

Да, это работает! благодаря! –