2017-12-12 20 views
0

함수 IF가 포함 된 사용자 정의 함수가 있습니다. data.table에서이 함수를 사용할 때 "조건의 길이가 1보다 크고 첫 번째 요소 만 사용됩니다"라는 경고가 나타납니다.data.table의 if 함수를 사용하는 경고 메시지

필자는 함수가 필요할 때마다 한 번에 한 행씩이 아닌 모든 행에 적용될 수 있다고 생각하지만 확실하지 않습니다.

이 경고가 나타나는 이유는 누구나 알고 있습니까?

내 기능은 다음과 같습니다

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''의 각 행에 적용 할 지정하는 것입니다 ' – SymbolixAU

+0

대개 'if'보다는이 종류의 비교에'ifelse'를 사용하는 것이 가장 좋습니다. https://stackoverflow.com/questions/17252905/else-if-vs-ifelse – Marius

+0

"by"매개 변수를 사용하면 경고가 계속 표시됩니다. 더 큰 데이터베이스에서 모든 행에 함수를 실행하는 데 많은 시간이 필요합니다. – Camilo

답변

0

에 함수를 적용 ifelse()을 사용하여 열 색인 기능을 벡터화하십시오. 논평에서 제안 된 또 다른 해결책은 행 단위로 계산하는 것보다 확실히 빠를 것입니다. `HeatINDEX [HI : = HeatIndex (Ave_MeanT, Ave_MeanRH) = 1 : nrow (HeatINDEX)]

# 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