Расчет направления ветра по U и V компонентам ветра с использованием lapply или ifelse - PullRequest
5 голосов
/ 30 декабря 2011

Усреднение скалярных данных о направлении ветра дает неточные значения из-за значений компаса в диапазоне от 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 ]

8 голосов
/ 30 декабря 2011

Вам следует взглянуть на использование функции atan2, это, вероятно, устранит необходимость во всех операторах if и дополнительных вычислениях.

Если вы много делаете с указаниями, вам также следует изучить пакеты circular и CircStats, которые позаботятся о многих из этих деталей для вас (некоторые похожи на то, что вы делали, просто более автоматизированы) .

7 голосов
/ 30 декабря 2011

Сначала определите функцию для вычисления:

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
4 голосов
/ 28 сентября 2012

Выезд:

https://www.eol.ucar.edu/content/wind-direction-quick-reference

Короче говоря, вы хотите использовать atan2, чтобы заботиться о различных квадрантах, но не забывайте, что углы определяются по-разному в метеорологии!Мы измеряем направление ветра в градусах по часовой стрелке от севера, тогда как функции типа atan2 обычно работают в радианах от направления X (т. Е. На восток).Таким образом, вы хотите использовать что-то вроде:

WDIR = 270-atan2 (V, U) * 180 / pi

Добавьте% 360, чтобы обеспечить выходное значение от 0 до 360:

WDIR = (270 атан2 (В, U) * 180 / пи)% 360

2 голосов
/ 02 января 2012
windDir <- function(u, v) {
  (180 / pi) * atan(u/v) + ifelse(v>0,180,ifelse(u>0,360,0))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...