2016-11-10 2 views
2

私は気象データのテーブルを持っている、との考えがデータフレーム

a)の気象データ
b)の天気+ 1SD
C)天候に基づいてモデルを実行することですへの変化曲線を適用します - 1sd

いくつかのタイプの信頼区間があります。だから私は2つの都市のための毎日のtempsを持っている、そして、月ごとに分けられた標準的な開発者の等価なテーブル。私がやりたいことは、関連する毎月のst.devを各値に適用することによってデータフレームを変換する関数を書くことです。下の点については、BoiseとIdaho Fallsのそれぞれの11月の値にそれぞれ9.07度と9.37度を追加したいと思います。そして、BoiseとIdahoのそれぞれについて、それぞれ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$month <- month(df$Date) 
df <- inner_join(df, sd_matrix, by="month") 

df$BOISE.x <- df$BOISE.x + df$BOISE.y 
df$`IDAHO FALLS.x` <- df$`IDAHO FALLS.x` + df$`IDAHO FALLS.y` 

df <- df %>% 
    select(Date, BOISE.x, `IDAHO FALLS.x`) 
names(df) <- c("Date,", "Boise", "Idaho Falls") 
+1

'私はこれを「面倒な」方法で行うことができます。「あなたのコードを試してみてください。 – zx8754

+0

これを含むようにオリジナルを編集しました。 – jsg51483

答えて

3

ますTidy Data paperを実際に読んでください。このようなことを考えるには非常に便利なフレームワークです。このフレームワークでは、カラム名の情報をエンコードするため、データが整頓されていないと言われます。つまり、「場所」は重要なデータですが、単一の列に配置する代わりに複数の列名を使用するため、必要以上にすべてが困難になります。我々は、単一の場所の列と単一の温度欄で、長い形式にデータを変換し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情報をエンコードするのではなく、-1, 0, 1の値と1つのテンポラリ列を持つSD乗数列を持つより長い形式にする方が便利かもしれません。上記のフォーマットは、信頼区間をプロットするなど、うまくいくでしょう。 +/- 2、1.5、1、.5標準偏差に興味があり、個々の見積もりごとにコードを実行していれば、さらに長い形式であればよいでしょう。

+0

ありがとうございます。私は実際にその論文を読んだことがありますが、それはまだ第二の性質ではありません(特に、私のデータの多くは優れたピボットから来ています。これはまったく頭の爪に当たって、まさに私が探していた清潔でエレガントなソリューションです。ありがとうございました。 – jsg51483