R 将更改曲线应用于数据帧

R 将更改曲线应用于数据帧,r,R,我有一个气象数据表,想法是运行一个基于 a) 天气数据 b) 天气+1sd c) 天气-1sd 得出某种类型的置信区间。这里我有两个城市的每日临时工,然后是标准开发人员的等效表,按月份划分。我想做的是编写一个函数,通过对每个值应用相关的、每月的st.DEV来转换数据帧。也就是说,关于下面,我想在博伊西瀑布和爱达荷瀑布每年11月的数值上分别加上9.07度和9.37度。。。然后在所有12月份的值上分别加上9.15度和11.03度,同样适用于博伊西瀑布和爱达荷瀑布 我知道我可以通过一些中间步骤以一种“

我有一个气象数据表,想法是运行一个基于

a) 天气数据
b) 天气+1sd
c) 天气-1sd

得出某种类型的置信区间。这里我有两个城市的每日临时工,然后是标准开发人员的等效表,按月份划分。我想做的是编写一个函数,通过对每个值应用相关的、每月的st.DEV来转换数据帧。也就是说,关于下面,我想在博伊西瀑布和爱达荷瀑布每年11月的数值上分别加上9.07度和9.37度。。。然后在所有12月份的值上分别加上9.15度和11.03度,同样适用于博伊西瀑布和爱达荷瀑布

我知道我可以通过一些中间步骤以一种“混乱”的方式完成这项工作,创建一些专栏,然后最终清理它们。不过,出于学习的兴趣,我想了解如何执行更优雅的解决方案

df <- structure(list(Date = c("2014-11-01", "2014-11-02", "2014-11-03", 
"2014-11-04", "2014-11-05", "2014-11-06", "2014-11-07", "2014-11-08", 
"2014-11-09", "2014-11-10", "2014-11-11", "2014-11-12", "2014-11-13", 
"2014-11-14", "2014-11-15", "2014-11-16", "2014-11-17", "2014-11-18", 
"2014-11-19", "2014-11-20", "2014-11-21", "2014-11-22", "2014-11-23", 
"2014-11-24", "2014-11-25", "2014-11-26", "2014-11-27", "2014-11-28", 
"2014-11-29", "2014-11-30", "2014-12-01", "2014-12-02", "2014-12-03", 
"2014-12-04", "2014-12-05", "2014-12-06", "2014-12-07", "2014-12-08", 
"2014-12-09", "2014-12-10", "2014-12-11", "2014-12-12", "2014-12-13", 
"2014-12-14", "2014-12-15", "2014-12-16", "2014-12-17", "2014-12-18", 
"2014-12-19", "2014-12-20", "2014-12-21", "2014-12-22", "2014-12-23", 
"2014-12-24", "2014-12-25", "2014-12-26", "2014-12-27", "2014-12-28", 
"2014-12-29", "2014-12-30"), BOISE = c(44.5, 42.5, 43.5, 47.5, 
55, 57.5, 49.5, 47.5, 45, 38, 31, 23.5, 24, 21.5, 11.5, 13, 13, 
13, 16, 22, 32, 42, 37, 38, 46.5, 48.5, 49.5, 52.5, 42, 26, 31.5, 
33, 40, 48.5, 40, 44, 43.5, 42, 42.5, 46, 57, 51, 39.5, 34, 36.5, 
39, 36.5, 40.5, 40.5, 40, 43.5, 39.5, 35.5, 33, 32, 29, 27, 31, 
27, 20.5699996948242), `IDAHO FALLS` = c(54.5, 36, 34.5, 35.5, 
41, 41.5, 47, 39, 45.5, 36, 15, 13, 14, 26, 4.5, 2.5, 8, 11, 
28, 27, 27, 35.5, 31.5, 33, 39, 43, 45.5, 46, 42.5, 28.5, 27, 
34, 35.5, 42, 36.5, 42.5, 35, 36, 34.5, 36.5, 42.5, 47, 39, 28, 
23.5, 31, 22.5, 24.5, 34.5, 35, 38.5, 34, 27.5, 31.5, 24.5, 8.5, 
15, 19, 10.5, -3.46000003814697)), class = "data.frame", .Names = c("Date", 
"BOISE", "IDAHO FALLS"), row.names = c(NA, -60L))

sd_matrix <- structure(list(month = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
), BOISE = c(7.90623167260698, 6.46123050256436, 6.38106936624632, 
7.22283114115187, 7.76515042234502, 8.10445388054925, 5.65058663778116, 
6.18033208264487, 7.34160028246709, 7.48784870009556, 9.07481352622016, 
9.15757443706943), `IDAHO FALLS` = c(10.4267588417941, 9.89036971863809, 
7.99156512696757, 6.84627542213131, 6.6696338642145, 6.823026513784, 
4.31982292105468, 4.63179196395735, 6.38702016727256, 7.31441201561822, 
9.37466284053354, 11.0316440728702)), class = "data.frame", row.names =     c(NA, 
-12L), .Names = c("month", "BOISE", "IDAHO FALLS"))

df你真的应该读一下-它提供了一个非常有用的框架来思考类似的事情。该框架会说您的数据不整洁,因为您正在用列名编码信息;也就是说,“位置”是一个重要的数据块,但不是将位置放在单个列中,而是放在多个列名中,这使得一切变得比需要的更困难

我们使用
tidyr::gather
将数据转换为长格式,其中包含一个位置列和一个温度列:

library(tidyr)
l_df = gather(df, key = loc, value = temp, -Date)
l_sd = gather(sd_matrix, key = loc, value = sd, -month)
完成后,我们可以对位置和月份进行简单的联接,然后根据需要添加和减去标准偏差:

result = mutate(l_df, month = lubridate::month(Date)) %>%
    inner_join(l_sd) %>%
    mutate(temp_u1 = temp + sd,
           temp_l1 = temp - sd)

此时可以使用
tidyr::spread
返回到宽格式,但我建议您将数据保留为这种格式。或者,更适合采用更长的格式,即不使用列名编码+/-SD信息,而是使用SD乘数列,该列的值为
-1、0、1
和单个临时列。我上面的格式适用于,例如,绘制置信带。如果您对+/-2、1.5、1.5标准差感兴趣,并且对每个单独的估计值运行代码,则更长的格式将更具通用性。

我可以以“混乱”的方式完成此操作…
请尝试并共享您的代码。我编辑了原始代码以包含此内容。非常感谢。事实上,我读过那篇文章,尽管有时它还不是第二天性(特别是我的许多数据来自excel数据透视,它们通常以“排列”格式保存,因为这样看它们更容易)。无论如何,这完全击中了要害,正是我所寻找的,一个干净、优雅的解决方案。再次感谢你。
result = mutate(l_df, month = lubridate::month(Date)) %>%
    inner_join(l_sd) %>%
    mutate(temp_u1 = temp + sd,
           temp_l1 = temp - sd)