尝试对数据帧中的离散点进行积分

时间:2019-02-08 22:39:24

标签: r

我有几个月的天气数据;一个示例日在这里:

   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

我需要通过整合到R中来计算15度以上的总时数。我正在分析农业中的学位日,它提供了有关相对增长率的有价值的信息。例如,小时10是2度,而小时11是15度以上的4度。这可以帮助预测何时收获水果。我该如何编写代码?

另一列可能通过简单的减法即可工作。然后,在取消所有负数之后,我将必须进行累加。这就是我现在打算采取的方法。我可以一步一步地写出一个完整的答案吗?

2 个答案:

答案 0 :(得分:0)

此解决方案减去您的阈值(即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

reprex package(v0.2.1.9000)于2019-02-08创建

答案 1 :(得分:0)

OP要求通过集成到R 中来计算出15度以上的小时总数。

我尚不清楚预期的结果是什么。 OP是否要对超过15度的小时数进行计数或OP要对大于15度的度数求和(“积分”)。

但是,下面的代码创建了两个图形。假设每小时对数据进行采样(没有间隙(如OP的样本数据集所建议),则可以使用library(ggplot2) library(scales) data.frame(response = sample(c("Yes", "No"), size = 100, replace = T, prob = c(0.4, 0.6))) %>% ggplot(aes(x = response)) + geom_bar(aes(y = (..count..)/sum(..count..))) + geom_text(aes(y = ((..count..)/sum(..count..)), label = scales::percent((..count..)/sum(..count..))), stat = "count", vjust = -0.25) + scale_y_continuous(labels = percent) + labs(title = "Proportion of Responses", y = "Percent", x = "Response") cumsum(),分别为:

sum()
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