2011-12-29 46 views
4

由於羅盤標題的範圍從0-360度,所以平均標量風向數據會產生不準確的值,所以我已將列表轉換爲u和v分量已經有了大小和風向。使用lapply或ifelse計算風的U和V分量的風向

爲了背出正確的風向,用於平均目的,我需要開發某種應用,ifelse,爲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 

回答

5

首先定義函數做計算:

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 
+1

美麗......感謝約翰......完美的作品。我在閱讀其他論壇時看過plyr軟件包,但都試圖用聚合標籤來貼合標籤,但對於這個問題我需要別的東西。我還在用一些精心製作的陳述,我不能完全弄明白。我很感謝 – RWJ 2011-12-29 21:15:20

+0

的幫助,這會起作用,但是在很多計算上會很慢。 – John 2011-12-29 22:17:50

+0

我只在30年的月平均數據和年平均數據上做這件事,所以它適用於我的目的。 – RWJ 2011-12-29 22:27:31

8

你應該看看使用atan2功能,它可能會刪除需要爲所有的if語句和額外的計算。

如果你正在做很多的指導,那麼你也應該看看circularCircStats包,這些包爲你處理了很多這些細節(有些與你所做的相似,只是更自動)。

+0

我發現CircStats更好的兩個。 – John 2011-12-29 22:18:20

2
windDir <- function(u, v) { 
    (180/pi) * atan(u/v) + ifelse(v>0,180,ifelse(u>0,360,0)) 
} 
3

退房:

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

+0

是%應該是模數? – 2016-10-15 00:13:42