Расчет направления ветра от U и V составляющих ветра с использованием lapply или ifelse
Усреднение скалярных данных о направлении ветра дает неточные значения из-за направления компаса в диапазоне от 0 до 360 градусов, поэтому я уже преобразовал свой список в компоненты u и v из величин и углов направления ветра.
Чтобы отменить правильное направление ветра, для целей усреднения мне нужно разработать какую-то функцию применения, хотя бы, функции для 3 следующих сценариев:
V > 0...((180 / pi) * atan((Ucomp/Vcomp)) + 180)
U and V < 0...((180 / pi) * atan((Ucomp/Vcomp)) + 0)
U > 0 and V < 0...((180 / pi) * atan((Ucomp/Vcomp)) + 360)
В наборе данных, который я хочу проанализировать, Ucomp больше 0, а Vcomp меньше нуля, но, несомненно, будут сценарии, в которых все 3 будут успешными, поэтому мне нужна функция для анализа и итеративного вычисления и применения правильного формула для каждого временного шага. Раньше я не использовал lapply или функции, поэтому я не играл с ними.
Я приведу образец данных ниже...
DateTime Wind.Spd Wind.Direction Air.Density Temp.C GEP.GE16XLE GCF.GE16XLE Ucomp Vcomp
1 1981 7.662370 248.3395 0.9148207 11.28967 597.7513 37.35946 5.253453 -0.7404972
2 1982 8.199412 251.6763 0.9172176 10.12751 678.8595 42.42872 5.867979 -0.6191475
3 1983 8.188782 251.7889 0.9162767 10.30619 667.9461 41.74663 5.777208 -1.0473982
4 1984 7.942632 246.7908 0.9174074 10.05093 642.6374 40.16484 5.415773 -0.6796723
5 1985 8.016558 252.7305 0.9171721 10.38414 654.2588 40.89117 5.649406 -0.9999082
6 1986 7.739984 249.6431 0.9158740 10.99859 607.0542 37.94089 5.305971 -0.9118965
4 ответа
Сначала определите функцию для расчета:
windDir <- function(u, v) {
if(v > 0) ((180 / pi) * atan(u/v) + 180)
if(u < 0 & v < 0) ((180 / pi) * atan(u/v) + 0)
if(u > 0 & v < 0) ((180 / pi) * atan(u/v) + 360)
}
Затем примените его к каждому ряду. Здесь я использую ddply
, который является хорошим вариантом "применять" для фреймов данных:
> library(plyr)
> ddply(data, 'DateTime', summarize, windDir=windDir(Ucomp, Vcomp))
DateTime windDir
1 1981 278.0232
2 1982 276.0232
3 1983 280.2760
4 1984 277.1531
5 1985 280.0370
6 1986 279.7517
Вы должны посмотреть на использование atan2
Функция, вероятно, устранит необходимость во всех операторах if и дополнительных вычислениях.
Если вы много делаете с указаниями, то вам также следует изучить circular
а также CircStats
пакеты, которые заботятся о многих из этих деталей для вас (некоторые похожи на то, что вы делали, просто более автоматичны).
Проверять, выписываться:
https://www.eol.ucar.edu/content/wind-direction-quick-reference
Короче говоря, вы хотите использовать atan2, чтобы позаботиться о различных секторах, но не забывайте, что в метеорологии углы определяются по-разному! Мы измеряем направление ветра в градусах по часовой стрелке от севера, тогда как функции типа atan2 обычно работают в радианах от направления X (т. Е. На восток). Итак, вы хотите использовать что-то вроде:
WDIR = 270 атан2(В,U)*180/ пи
Добавьте%360, чтобы убедиться, что результат находится между 0 и 360:
WDIR = (270 атан2(В,U)*180/ пи)%360
windDir <- function(u, v) {
(180 / pi) * atan(u/v) + ifelse(v>0,180,ifelse(u>0,360,0))
}