【问题标题】:Calculating new variable based on conditions from multiple rows根据多行条件计算新变量
【发布时间】:2018-12-06 22:01:53
【问题描述】:

我在创建代码以从每个嵌套有多行的原始数据框中计算嵌套开始日期时遇到问题。我的数据集如下所示:

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,我需要从 Julian 日期中减去雏鸟年龄,并减去 12 天的潜伏期。所以 Nest02 的启动日期应该是 126 (143-5-12)。

我不太确定如何去做。我已经使用 dplyr 按 NestID 进行分组,但之后我不确定如何为每个分类下的巢编码。我也尝试过设置 if 语句,但是根据我在网上找到的分别查看每一行的内容,我需要它来查看整个组。

如果人们能提供任何帮助,我们将不胜感激。

【问题讨论】:

    标签: r if-statement dplyr


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      • 2023-01-23
      • 2020-02-19
      • 2018-08-07
      • 2021-08-31
      相关资源
      最近更新 更多