在 R 中创建索引,将超过阈值的天数乘以超过阈值的数量

Create index multiplying number of days over a threshold by amount over threshold by group in R

我正在使用 R 中的驼鹿遥测数据集,该数据集由多头驼鹿、每天每头驼鹿的多个 gps 位置以及每天获取的温度数据组成。我想创建一个热应力指数,方法是将驼鹿经历的温度高于 -5 的天数乘以高于该阈值的度数。每次温度低于 -5 时,高于阈值的天数都会重置。我对创建低于 -5 的索引不感兴趣,因此温度低于 -5 的数据点可以具有 NA 的索引。

每只驼鹿的位置可能与其他驼鹿不同,因此我需要对每只驼鹿重复此过程。

下面是一个示例数据集,我有类似于 Moose、Date 和 Temperature 的列,我想创建一个像 TempIndex 这样的列。

正如您在 2013-01-01 看到的那样,驼鹿 1 (M1) 和驼鹿 2 (M2) 经历了 2C 的温度,比 -5 高 7C,并且是在 -5 阈值以上的第二天,创造索引为 14(又名 2*7)。

Moose <- c('M1','M1','M1','M1',
           'M1','M1','M1','M1',
           'M1','M1','M1','M1',
           'M2','M2','M2','M2',
           'M2','M2','M2','M2',
           'M2','M2','M2','M2')

Date <- as.Date(c('2012-12-30','2012-12-31','2012-12-31','2013-01-01',
                  '2013-01-01','2013-01-01','2013-01-02','2013-01-02',
                  '2013-01-03','2013-01-03','2013-01-04','2013-01-04',
                  '2012-12-30','2012-12-30','2012-12-31','2012-12-31',
                  '2013-01-01','2013-01-01','2013-01-02','2013-01-02',
                  '2013-01-02','2013-01-03','2013-01-04','2013-01-04'))

Temperature <- c(-6,-4,-4, 2,
                  2, 2,-8,-8,
                  1, 1,-9,-9,
                 -6,-6,-4,-4,
                  2, 2,-8,-8,
                 -8, 1,-9,-9)

TempIndex <- c(NA, 1, 1,14,
               14,14,NA,NA,
                6, 6,NA,NA,
               NA,NA, 1, 1,
               14,14,NA,NA,
               NA, 6,NA,NA)

dat <- data.frame(Moose,Date,Temperature,TempIndex)


dat

   Moose    Date    Temperature TempIndex
1     M1 2012-12-30          -6        NA
2     M1 2012-12-31          -4         1
3     M1 2012-12-31          -4         1
4     M1 2013-01-01           2        14
5     M1 2013-01-01           2        14
6     M1 2013-01-01           2        14
7     M1 2013-01-02          -8        NA
8     M1 2013-01-02          -8        NA
9     M1 2013-01-03           1         6
10    M1 2013-01-03           1         6
11    M1 2013-01-04          -9        NA
12    M1 2013-01-04          -9        NA
13    M2 2012-12-30          -6        NA
14    M2 2012-12-30          -6        NA
15    M2 2013-12-31          -4         1
16    M2 2013-12-31          -4         1
17    M2 2013-01-01           2        14
18    M2 2013-01-01           2        14
19    M2 2013-01-02          -8        NA
20    M2 2013-01-02          -8        NA
21    M2 2013-01-02          -8        NA
22    M2 2013-01-03           1         6
23    M2 2013-01-04          -9        NA
24    M2 2013-01-04          -9        NA

您可以使用 tidyverse 并尝试以下操作。

Moose 分组后,您可以创建温度从低于 -5 度到高于 -5 度的组。发生这种情况时,它会启动一个新的组号,也可以在您的分组中使用。

然后,您可以根据您的公式计算温度指数。这假设您的日期是按时间顺序排列的(如果不是,您可以使用 arrange)。

结果似乎相符(尽管我认为驼鹿 M2 的日期不是从“2012-12-30”到“2013-12-31”的预期日期。

library(tidyverse)

dat %>%
  group_by(Moose) %>%
  group_by(Group = cumsum(Temperature > -5 & lag(Temperature <= -5, default = 0)), .add = TRUE) %>%
  mutate(NewTempIndex = ifelse(Temperature > -5, (Temperature + 5) * (Date - first(Date) + 1), NA_integer_))

输出

   Moose Date       Temperature TempIndex Group NewTempIndex
   <chr> <date>           <dbl>     <dbl> <int>        <dbl>
 1 M1    2012-12-30          -6        NA     0           NA
 2 M1    2012-12-31          -4         1     1            1
 3 M1    2012-12-31          -4         1     1            1
 4 M1    2013-01-01           2        14     1           14
 5 M1    2013-01-01           2        14     1           14
 6 M1    2013-01-01           2        14     1           14
 7 M1    2013-01-02          -8        NA     1           NA
 8 M1    2013-01-02          -8        NA     1           NA
 9 M1    2013-01-03           1         6     2            6
10 M1    2013-01-03           1         6     2            6
# … with 14 more rows