2017-02-09 8 views
2

長形式風データをワイドフォーマットに変換しようとしています。風速と風向きの両方がParameter.Name列に表示されます。これらの値は、Local.Site.NameとDate.Local変数の両方によってキャストする必要があります。dcastでEPAの風速と風向データを作り直すR

一意のLocal.Site.Name + Date.Local行ごとに複数の観測値がある場合、それらの観測値の平均値が必要です。組み込みの引数 'fun.aggregate = mean'は風速には問題ありませんが、平均風向は値が度であるためこのように計算することはできません。たとえば、北(350、10)に近い2つの風向の平均は南(180)として出力されます。極平均値が360または0であるにもかかわらず、たとえば((350 + 10)/ 2 = 180)。

'循環型'パッケージでは、三角法を実行することなく平均風向きを計算できます。私は 'fun.aggregate'引数の中にこの追加機能を入れ子にしようとするのに問題があります。文がトリックを行うならば、私は他の単純なと思ったが、私は次のようなエラーに実行しています:

Error in vaggregate(.value = value, .group = overall, .fun = fun.aggregate, : could not find function ".fun" 
In addition: Warning messages: 
1: In if (wind$Parameter.Name == "Wind Direction - Resultant") { : 
    the condition has length > 1 and only the first element will be used 
2: In if (wind$Parameter.Name == "Wind Speed - Resultant") { : 
    the condition has length > 1 and only the first element will be used  
3: In mean.default(wind$"Wind Speed - Resultant") : 
    argument is not numeric or logical: returning NA 

目標は、風速のためfun.aggregate = meanを使用できるようにすることですが、風向についてmean(circular(Wind Direction, units = 'degrees')

は、ここで元のデータ(> 100メガバイト)です: https://drive.google.com/open?id=0By6o_bZ8CGwuUUhGdk9ONTgtT0E

はここでデータ(第一100行)のサブセットです: https://drive.google.com/open?id=0By6o_bZ8CGwucVZGT0pBQlFzT2M

ここに私のスクリプトです:

library(reshape2) 
library(dplyr) 
library(circular) 

#read in the long format data: 
wind <- read.csv("<INSERT_FILE_PATH_HERE>", header = TRUE) 

#cast into wide format: 
wind.w <- dcast(wind, 
      Local.Site.Name + Date.Local ~ Parameter.Name, 
      value.var = "Arithmetic.Mean", 
      fun.aggregate = (
       if (wind$Parameter.Name == "Wind Direction - Resultant") { 
       mean(circular(wind$"Wind Direction - Resultant", units = 'degrees')) 
       } 
       else if (wind$Parameter.Name == "Wind Speed - Resultant") { 
       mean(wind$"Wind Speed - Resultant") 
       }), 
      na.rm = TRUE) 

すべてのヘルプ大変感謝しています!

EDITを-spacedSparking

:HEREソリューションです:

library(reshape2) 
library(SDMTools) 
library(dplyr) 
#read in the EPA wind data: 
#This data is publicly accessible, and can be found here: https://aqsdr1.epa.gov/aqsweb/aqstmp/airdata/download_files.html  
wind <- read.csv("daily_WIND_2016.csv", sep = ',', header = TRUE, stringsAsFactors = FALSE) 

#convert long format wind speed data by date and site id: 
wind_speed <- dcast(wind, 
        Local.Site.Name + Date.Local ~ Parameter.Name, 
        value.var = "Arithmetic.Mean", 
        fun.aggregate = function(x) { 
         mean(x, na.rm=TRUE) 
        }, 
        subset = .(Parameter.Name == "Wind Speed - Resultant") 
) 

#convert long format wind direction data into wide format by date and local site id: 
wind_direction <- dcast(wind, 
         Local.Site.Name + Date.Local ~ Parameter.Name, 
         value.var = "Arithmetic.Mean", 
         fun.aggregate = function(x) { 
          if(length(x) > 0) 
          circular.averaging(x, deg = TRUE) 
          else 
          -1 
         }, 
         subset= .(Parameter.Name == "Wind Direction - Resultant") 
) 

#join the wide format split wind_speed and wind_direction dataframes 
wind.w <- merge(wind_speed, wind_direction) 
+0

データファイルの先頭から最初の100行程度を切り取り、ここに投稿する必要があります。あなたの質問に答えたいと思っている人に106MBをダウンロードさせることは、ヘルパーの数を減らす責任があります。 – Richard

+0

データを100行分トリムするようにしました。提案してくれてありがとう、私は新しいスタックです! – spacedSparking

+0

これははるかに簡単ですが、この小さなデータセットで解決しようとしている問題がまだ示されていることを確認しましたか?あなたの目標は、あなたの質問を理解して答えられるように、できるだけアクセス可能なリソースを作ることです。 – Richard

答えて

0

次の2つの関数を適用し、別々のデータフレームは、その後、彼らに私はこの厄介な風向きの問題を解決するために管理あなたの助けのすべてに

library(reshape2) 
library(dplyr) 
library(circular) 

#cast into wide format: 
wind_speed <- dcast(wind, 
       Local.Site.Name + Date.Local ~ Parameter.Name, 
       value.var = "Arithmetic.Mean", 
       fun.aggregate = function(x) { 
        mean(x, na.rm=TRUE) 
       }, 
       subset=.(Parameter.Name == "Wind Speed - Resultant") 
) 

wind_direction <- dcast(wind, 
        Local.Site.Name + Date.Local ~ Parameter.Name, 
        value.var = "Arithmetic.Mean", 
        fun.aggregate = function(x) { 
         if(length(x) > 0) 
         mean(circular(c(x), units="degrees"), na.rm=TRUE) 
         else 
         -1 
        }, 
        subset=.(Parameter.Name == "Wind Direction - Resultant") 
) 


wind.w <- merge(wind_speed, wind_direction) 
+0

長い形式のデータをサブセット化する本当にエレガントな方法です。私は、 'circular()'関数が望むように風向きを集約しないことに気付きました。サイトと日付が0度から360度までの範囲内にあるようにしてください。この問題に取り組むために、openairパッケージからいくつかの関数を使用したいと考えています。 – spacedSparking

0

あなたはwind.wを定義するコードの内部wind.wを使用している - 仕事に行くのではないこと!

また、直線引用符( ')の代わりに斜めの引用符( `)を使用しています。ストリングを区切るには、ストレートの引用符を使用する必要があります。

+0

「wind.w」の問題を指摘してくれてありがとう。オートコンプリートは、角度のついた引用符で困っています。これらの変更を行った後、次のエラーが表示されます。 – spacedSparking

+0

'バグのエラー(.value = value、.group = overall、.fun = fun.aggregate、:0​​は関数" .fun "を見つけることができませんでした – spacedSparking

0

よし感謝をマージ取得するdcastでサブセットを使用することができます。時々問題を解決することは、質問する正しい質問を知ることの問題です。私の場合、用語「ベクトル平均化」を学ぶことは私が必要としていたものでした! SDMToolsパッケージのcircular.averaging()というベクトル平均化機能が組み込まれており、風向きを平均化し、出力は0-359度です。私がやったことは、tjjjohnsonのスクリプトを追加することでした。 fun.aggregate引数をmean(circular(c(x), units = "degrees"), na.rm = TRUE)からcircular.averaging(x, deg = TRUE)に変更しました。ここにはraw and aggregatedデータのヒストグラムがあります。すべてが良い見て、みんなありがとう!

関連する問題