2017-02-09 2 views
2

Я пытаюсь преобразовать данные ветра с длинным форматом в широкий формат. Скорость ветра и направление ветра указаны в столбце Parameter.Name. Эти значения должны быть заданы как Local.Site.Name, так и Date.Local.Перестройка данных скорости ветра и направления EPA с помощью dcast в R

Если имеется несколько наблюдений за уникальную локальную строку Local.Site.Name + Date.Local, тогда я хочу получить среднее значение этих наблюдений. Встроенный аргумент «fun.aggregate = mean» отлично подходит для скорости ветра, но среднее направление ветра не может быть рассчитано таким образом, потому что значения находятся в градусах. Например, среднее из двух направлений ветра вблизи Севера (350, 10) будет выводиться как Юг (180). Например: ((350 + 10)/2 = 180), несмотря на то, что полярный средний показатель равен 360 или 0.

«Круговой» пакет позволит нам вычислить среднее направление ветра без необходимости выполнять любую тригонометрию, но У меня возникли проблемы с попыткой вложить эту дополнительную функцию в аргумент 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') для направления ветра.

Вот исходные данные (> 100MB): https://drive.google.com/open?id=0By6o_bZ8CGwuUUhGdk9ONTgtT0E

Вот подмножество данных (1-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) 

Любая помощь был бы очень признателен!

-spacedSparking

EDIT: Вот решение:

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

вы можете использовать подмножество в dcast применить две функции и получить Seperate dataframes затем объединить их

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

Это по-настоящему элегантный способ подмножества данных с большим форматом. При этом я понял, что функция «круг»() 'не объединяет направление ветра так, как я надеялся, в конечном итоге, я хочу, чтобы мое среднее направление ветра в сайта и даты, чтобы быть в пределах одного и того же диапазона от 0 до 360 градусов.Я надеюсь использовать некоторые функции из пакета 'openair' в надежде решить эту проблему вместо этого. Я ценю ваш ответ! – spacedSparking

0

Вы используете wind.w внутри кода, который определяет wind.w - это не будет работать!

Вы также используете угловые кавычки (`) вместо прямых меток ('). Прямые кавычки должны использоваться для определения строки.

+0

Спасибо, что указал на проблему 'wind.w'. Спасибо, автокомплект заставил меня разобраться с угловыми кавычками. После внесения этих изменений у меня осталась следующая ошибка: – spacedSparking

+0

'Ошибка в vaggregate (.value = значение, .group = в целом, .fun = fun.aggregate,: не удалось найти функцию" .fun "' – spacedSparking

0

Alright спасибо всем вашей помощи мне удалось решить эту проблему надоедливых направления ветра. Иногда решение проблем - это просто вопрос правильных вопросов. В моем случае изучение слова «векторное усреднение» было всем необходимым! Существует встроенная функция векторного усреднения, называемая circular.averaging() из пакета SDMTools, которая усредняет направление ветра и производит выход, который все еще находится между 0-359 градусами! То, что я закончил, - это добавить скрипт tjjjohnson. Я изменил аргумент fun.aggregate от mean(circular(c(x), units = "degrees"), na.rm = TRUE) до circular.averaging(x, deg = TRUE) Вот гистограммы данных raw and aggregated! Все выглядит хорошо, спасибо всем!

Смежные вопросы