在 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
我正在使用 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