根据来自多行的条件计算新变量

时间:2018-12-06 22:01:54

标签: r if-statement dplyr

我在创建代码以从每个嵌套有多个行的原始数据帧计算嵌套初始化日期方面遇到麻烦。我的数据集看起来像这样:

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 :(得分:0)

我没有使用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