Вычисление новой переменной на основе условий из нескольких строк - PullRequest
0 голосов
/ 07 декабря 2018

У меня проблемы с созданием кода для вычисления даты начала гнезда из исходного фрейма данных, который имеет несколько строк для каждого гнезда.Мой набор данных выглядит примерно так:

NestID  JulianDate  Stage   HostEggs    HostYoung   NSTLAge NestFate
Nest01  146         IB         2           0         NA 
Nest01  149         NG         0           2         1  
Nest01  153         NG         0           2         5  
Nest01  156         NG         0           2         8  
Nest01  160         FL         0           0         NA       Fledged
Nest02  143         NG         1           1         5  
Nest02  147         D          0           0         NA       Depredated

Что я хотел бы сделать, это рассчитать дату инициации для типов гнезд, которые соответствуют определенным критериям.Для Nest01 я хочу использовать среднюю точку между последним днем ​​на этапе IB и первым днем ​​на этапе NG, а затем вычесть 12 дней из этого (инкубационный период. Так что для этого примера средняя точка будет 147,5 и 12 дней до этого135,5 для даты инициации.

Для гнезд, которые были найдены в период птенцов, я хочу рассчитать дату инициации на основе NSTLAge. Для Nest02 мне нужно вычесть возраст птенцов из юлианской даты, а также вычесть12 дней для инкубационного периода. Таким образом, дата начала для Nest02 должна составлять 126 (143-5-12).

Я не совсем уверен, как это сделать. Я использовал dplyr для группировкипо NestID, но после этого я не уверен в том, как кодировать гнезда, которые подпадают под каждую классификацию. Я также пытался настроить операторы if, но из того, что я нашел в Интернете, просматривается каждая строка отдельно, и мне нужно посмотреть нався группа.

Любая помощь, которую могут оказать люди, будет оченьоценили.

1 Ответ

0 голосов
/ 07 декабря 2018

Я не использовал dplyr, но я думаю, что это решает проблему.

NestID <- c(rep("Nest01",5),rep("Nest02",2))
JulianDate <- c(146,149,153,156,160,143,147)
Stage <- c("IB","NG","NG","NG","FL","NG","D")
HostEggs <- c(2,0,0,0,0,1,0)
HostYoung <- c(0,2,2,2,0,1,0)
NSTLAge <- c(NA,1,5,8,NA,5,NA)
NestFate <- c(rep(" ",4),"Fledged"," ","Depredated")
data <- data.frame(NestID,JulianDate,Stage,HostEggs,HostYoung,NSTLAge,NestFate)

InitiationDate <- c()
nests <- names(table(NestID)) #I got the names of the nests
for(i in 1:length(nests)){
  p <- min(which(data$NestID==nests[i])) #This is to see the position where the i nest beggings
  if(data$Stage[p]=="IB"){
    a <- max(which(data$Stage[which(data$NestID==nests[i])]=="IB"))
    b <- min(which(data$Stage[which(data$NestID==nests[i])]=="NG"))
    InitiationDate[i] <- mean(data$JulianDate[c(a,b)]) - 12
  } else if(data$Stage[p]=="NG"){
    InitiationDate[i] <- data$JulianDate[p] - data$NSTLAge[p] - 12
  }
}
names(InitiationDate) <- nests; InitiationDate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...