2017-12-12 8 views
0

私は関数IFを含むカスタム関数を持っています。その関数をdata.tableで使用すると、 という警告が表示されます。「条件の長さが1より大きく、最初の要素のみが使用されます。data.tableのif関数を使用した警告メッセージ

私はこの機能を必要に応じて一度に1つの行ではなく列のすべ​​ての行に適用できると思いますが、私は確信していません。

この警告が表示される理由を知っている人はいますか?

My機能は次のとおりです。

HeatIndex<-function(TempC,RH) 
{ 
TFarheit= TempC * 1.8 + 32 
if(TFarheit <80 ) { 
    Te=TempC /15 
    HI = Te/15 
} else { 
    TA=TempC /11 
    HI = TA/125 
} 
HI= (HI - 32)/1.8 
return(HI) 
} 

データのサンプル:

HeatINDEX=data.table(Ave_MeanRH=c(0,100), Ave_MeanT=c(10,20)) #create data.table 

とコメントで、あなたがすることができます示唆したようにデータ

HeatINDEX[,HI:=HeatIndex(HeatINDEX$Ave_MeanT, HeatINDEX$Ave_MeanRH)]  
+0

'速い' ソリューションは、あなたがそれを 'by'の各行に適用する指定することです:'不快指数[、HI:=不快指数(Ave_MeanT、Ave_MeanRH)、= 1:nrow(不快指数)] ' – SymbolixAU

+0

通常は、' if'ではなく 'ifelse'を使用して比較を行います。 https://stackoverflow.com/questions/17252905/else-if-vs-ifelse – Marius

+0

「by」パラメータを使用しても警告が維持されますを参照してください。より大きいデータベースでは、すべての行に関数を実行するのに多くの時間がかかります – Camilo

答えて

0

に関数を適用ifelse()を使用してヒートインデックス関数をベクトル化します。これは確かに、行ごとに計算するよりも速く、コメントで示唆された別のソリューションです。

# Vectorized version of function: 
computeHI = function(T_cel, RH) { 
    T_far = T_cel * 1.8 + 32 
    HI = ifelse(test=T_far < 80, 
       yes=(T_cel/15)/15, 
        no=(T_cel/11)/125) 
    HI = (HI - 32)/1.8 
    return(HI) 
} 

HeatINDEX[,HI:=HeatIndex(Ave_MeanT, Ave_MeanRH), by=seq(2)] 
HeatINDEX[,vectorized_HI:=computeHI(Ave_MeanT, Ave_MeanRH)] 

HeatINDEX 
# Ave_MeanRH Ave_MeanT  HI vectorized_HI 
# 1:   0  10 -17.75309  -17.75309 
# 2:  100  20 -17.72840  -17.72840 
+0

C→FとF→C変換を避けることでこれをさらに高速化できるのでしょうか? – bdemarest

+0

ちょうどヘッドアップ、これらの計算された熱指数は意味をなさないように思われます。数学を二重にチェックしたいかもしれません!しかし、少なくともあなたは今ベクトル化する方法を知っています。 – bdemarest

+0

この関数は、エラーを示すデモです。なんらかの理由で、ifelse – Camilo

関連する問題