Я пытаюсь преобразовать данные ветра с длинным форматом в широкий формат. Скорость ветра и направление ветра указаны в столбце 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)
Вы должны скопировать верхнюю часть вашего файла данных на первые 100 строк или около того и опубликовать это здесь.Если вы хотите, чтобы каждый, кто хочет ответить на ваш вопрос, загружает 106MB, он может уменьшить количество помощников. – Richard
Я удостоверился, что вы обрезаете данные до 100 строк. Спасибо за предложение, я новичок в стеке! – spacedSparking
Спасибо, с этим гораздо проще работать, но вы подтвердили, что этот небольшой набор данных все еще показывает проблему, которую вы пытаетесь решить? Ваша цель в том, чтобы сделать как можно более доступными ресурсы, доступные для понимания и ответа на ваш вопрос. – Richard