Попытка интегрировать по отдельным точкам из фрейма данных - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть данные погоды за несколько месяцев;пример дня здесь:

   Hour Avg.Temp
1     1       11
2     2       11
3     3       11
4     4       10
5     5       10
6     6       11
7     7       12
8     8       14
9     9       15
10   10       17
11   11       19
12   12       21
13   13       22
14   14       24
15   15       23
16   16       22
17   17       21
18   18       18
19   19       16
20   20       15
21   21       14
22   22       12
23   23       11
24   24       10

Мне нужно вычислить общее количество часов выше 15 градусов, интегрируя в R. Я анализирую дни дней, концепцию в сельском хозяйстве, которая дает ценную информациюоб относительной скорости роста.Например, 10-й час равен 2 градусным часам, а 11-й - 4 градусным часам выше 15 градусов.Это может помочь предсказать, когда собирать фрукты.Как я могу написать код для этого?

Другой столбец может потенциально работать с простым вычитанием.Тогда я должен был бы сделать кумулятивную сумму после удаления всех отрицательных чисел.Это подход, который я собираюсь сделать прямо сейчас.Есть ли интеграл, который я мог бы написать и получить ответ за один шаг?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

ОП запросил вычислить общее количество часов выше 15 градусов, интегрируя в R .

Мне не совсем ясно, каков ожидаемый результат.Желает ли OP считать количество часов выше 15 градусов или OP хочет суммировать градусы больше 15 («интегрировать»).

Однако приведенный ниже код создает обе цифры.Предполагается, что данные отбираются в каждый час без пропусков (как предложено в наборе данных OP), можно использовать cumsum() и sum(), соответственно: * 10101 *

library(data.table)
setDT(DT)[, c("deg_hrs_sum",  "deg_hrs_cnt") := 
            .(cumsum(pmax(0, Avg.Temp - 15)), cumsum(Avg.Temp > 15))]
    Hour Avg.Temp deg_hrs_sum deg_hrs_cnt
 1:    1       11           0           0
 2:    2       11           0           0
 3:    3       11           0           0
 4:    4       10           0           0
 5:    5       10           0           0
 6:    6       11           0           0
 7:    7       12           0           0
 8:    8       14           0           0
 9:    9       15           0           0
10:   10       17           2           1
11:   11       19           6           2
12:   12       21          12           3
13:   13       22          19           4
14:   14       24          28           5
15:   15       23          36           6
16:   16       22          43           7
17:   17       21          49           8
18:   18       18          52           9
19:   19       16          53          10
20:   20       15          53          10
21:   21       14          53          10
22:   22       12          53          10
23:   23       11          53          10
24:   24       10          53          10
    Hour Avg.Temp deg_hrs_sum deg_hrs_cnt

В качестве альтернативы,

setDT(DT)[, .(deg_hrs_sum = sum(pmax(0, Avg.Temp - 15)),
              deg_hrs_cnt = sum(Avg.Temp > 15))]

возвращает только конечный результат (последний ряд):

   deg_hrs_sum deg_hrs_cnt
1:          53          10

Данные

library(data.table)
DT <- fread("
rn   Hour Avg.Temp
1     1       11
2     2       11
3     3       11
4     4       10
5     5       10
6     6       11
7     7       12
8     8       14
9     9       15
10   10       17
11   11       19
12   12       21
13   13       22
14   14       24
15   15       23
16   16       22
17   17       21
18   18       18
19   19       16
20   20       15
21   21       14
22   22       12
23   23       11
24   24       10", drop = 1L)
0 голосов
/ 09 февраля 2019

Это решение вычитает ваш порог (т. Е. 15 °), подгоняет функцию к результату, а затем интегрирует эту функцию.Обратите внимание, что если температура ниже порогового значения, это дает ноль к общему, а не отрицательному значению.

df <- read.table(text = "Hour Avg.Temp
1     1       11
2     2       11
3     3       11
4     4       10
5     5       10
6     6       11
7     7       12
8     8       14
9     9       15
10   10       17
11   11       19
12   12       21
13   13       22
14   14       24
15   15       23
16   16       22
17   17       21
18   18       18
19   19       16
20   20       15
21   21       14
22   22       12
23   23       11
24   24       10", header = TRUE)

with(df, integrate(approxfun(Hour, pmax(Avg.Temp-15, 0)),
                   lower = min(Hour), upper = max(Hour)))
#> 53.00017 with absolute error < 0.0039

Создано в 2019-02-08 пакетом prex (v0.2.1.9000)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...