我有几个月的天气数据;一个示例日在这里:
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度。这可以帮助预测何时收获水果。我该如何编写代码?
另一列可能通过简单的减法即可工作。然后,在取消所有负数之后,我将必须进行累加。这就是我现在打算采取的方法。我可以一步一步地写出一个完整的答案吗?
答案 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