首页 > 解决方案 > 如何根据值的倍数循环(R)

问题描述

我有一组观察结果,包括巢穴 ID 和观察日期。我创建了一个变量,它给出了每个嵌套的每个观察值之间的间隔。我需要为每个巢创建一个新变量,为每个观察值分配一个唯一值,该值在 145 天的时间间隔内。本质上,我的数据的缩短版本如下所示:

   Date       Nest_ID interval total_interval
  
 1 2015-02-22 a              0              0
 2 2015-05-26 a             93             93
 3 2015-07-08 a             43            136
 4 2015-12-07 a            152            288
 5 2016-01-29 a             53            341
 6 2016-04-02 a             64            405
 7 2016-07-06 a             95            500
 8 2016-11-05 a            122            622
 9 2017-06-29 b              0              0
10 2015-02-22 c              0              0

我需要它看起来像这样:

    Date       Nest_ID interval total_interval      Nest_period
   
 1 2015-02-22 a              0              0                 1
 2 2015-05-26 a             93             93                 1
 3 2015-07-08 a             43            136                 1
 4 2015-12-07 a            152            288                 2
 5 2016-01-29 a             53            341                 2
 6 2016-04-02 a             64            405                 2
 7 2016-07-06 a             95            500                 3
 8 2016-11-05 a            122            622                 3
 9 2017-06-29 b              0              0                 1
10 2015-02-22 c              0              0                 1

如果我可以让 total_interval 计数在达到 145 时重新启动,这似乎是理想的解决方案,但是我还没有弄清楚。

这是一些获取示例数据的代码:

Date <- c("2015-02-22", "2015-05-26", "2015-07-08", "2015-12-07", "2016-01-29", "2016-04-02", "2016-07-06", "2016-11-05", "2017-06-29", "2015-02-22")

Nest_ID <- c("a", "a", "a", "a", "a", "a", "a", "a", "b", "c")

interval <- (c(0,93,43,152,53,64,95,122,0,0))

total_interval <- (c(0,93,136,288,341,405,500,622,0,0))

df <- data.frame(Date, Nest_ID, interval, total_interval)

非常感谢任何帮助!谢谢!

标签: rdplyr

解决方案


这很混乱,但我找不到简单的方法。

df <- df %>%
  mutate(interval = as.numeric(interval),
         total_interval = as.numeric(total_interval))
groups <- unique(df$Nest_ID)
res <- c()
for (i in groups){
  df2 <- df %>%
    filter(Nest_ID %in% i)
  n <- 1
  for(i in 1:dim(df2)[1]){
    if (df2$total_interval[i] < 145) {
      res<-c(res,n)
    } else {
      n <- n + 1
      df2$total_interval <- df2$total_interval - df2$total_interval[i]
      res<-c(res,n)
    }
    print(n)
  }
  
  
}
res
df$idx <- replace_na(res, 1)
df

结果如下。idxNest_period想要吗

         Date Nest_ID interval total_interval idx
1  2015-02-22       a        0              0   1
2  2015-05-26       a       93             93   1
3  2015-07-08       a       43            136   1
4  2015-12-07       a      152            288   2
5  2016-01-29       a       53            341   2
6  2016-04-02       a       64            405   2
7  2016-07-06       a       95            500   3
8  2016-11-05       a      122            622   3
9  2017-06-29       b        0              0   1
10 2015-02-22       c        0              0   1

推荐阅读