由于指南针标题范围为0-360度,平均标量风向数据会产生不准确的值,所以我已经将我的列表从幅度和风向角度转换为u和v分量。
为了取消适当的风向,为了平均目的,我需要为以下3种情况开发某种应用,ifelse功能:
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
答案 0 :(得分:8)
您应该查看使用atan2
函数,它可能会删除所有if语句和额外计算的需要。
如果您正在做很多指导,那么您还应该查看circular
和CircStats
包,这些包为您处理了很多这些细节(有些类似于您所做的,更自动)。
答案 1 :(得分:7)
首先定义进行计算的函数:
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
答案 2 :(得分:4)
退房:
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-atan2(V,U)* 180 / pi)%360
答案 3 :(得分:2)
windDir <- function(u, v) {
(180 / pi) * atan(u/v) + ifelse(v>0,180,ifelse(u>0,360,0))
}