基于R中的风速计算不同方程的Windchill

时间:2015-06-08 17:25:53

标签: r

R编程

我是一名新的R程序员,试图编写一个脚本,根据不同的风速参数计算具有3个不同方程的windchill。我试图使用apply函数来执行此操作。

摄取的数据是数据帧(csv文件),其中每行是不同的天气观测,包括站名,站ID,时间(年,月,日,小时),然后是气象数据,temp(DRY_BUILB_TEMP)和风速(WIND_SPEED)。计算挡风玻璃只需要温度和风速。

我使用的算法如下:

  • 提取数据
  • 子集出windspeed(v)具有以下条件的数据:V&gt; = 5,V&gt; 1&amp; V&lt; 5,V < 1
  • 然后我为前两个子集编写了一个函数来计算windchill,两个不同的方程式。对于最后一个条件,windchill将等于temp。
  • 然后我尝试使用apply函数来计算具有适当函数和子集的windchill数据。
  • 然后我尝试将原始子集和windchill数据重新组合在一起。

我的应用函数出现了问题,我只想对数据框中的每一行进行一次响应,即计算该行数据的windchill。但是,我为每一行收到每个列的计算windchill(所有相同的值)。我应该使用哪种应用功能?或者我应该将数据进一步分组到仅具有临时和风速数据?当然,由于我无法获得只有windchill的列表,程序的结尾部分也无法正常工作,数据也无法绑定到子集。

这是我到目前为止的程序:

data <- read.csv("HfxTestWind.csv")

data_1 <- subset(data, WIND_SPEED >= 5)
data_2 <- subset(data, WIND_SPEED > 1 & WIND_SPEED < 5)
data_3 <- subset(data, WIND_SPEED < 1)

windchill_1 <- function(temp1, wind1){
    temp1 <- data_1$DRY_BULB_TEMP
    wind1 <- data_1$WIND_SPEED
    result_1 <- 13.12 + 0.6215 * temp1 - 11.37 * (wind1 ^ (0.16)) + 0.3965* 
            temp1 * (wind1 ^ (0.16))
    return(result_1)
}

windchill_2 <- function(temp2, wind2){
    temp2 <- data_2$DRY_BULB_TEMP
    wind2 <- data_2$WIND_SPEED
    result_2 <- temp2 + ((-1.59 + 0.1345 * (temp2) / 5 * wind2))
    return(result_2)
}

WIND_CHILL_1 <- lapply(data_1, windchill_1)
data_comp_1 <- cbind(data_1, WIND_CHILL_1)

WIND_CHILL_2 <- lapply(data_2, windchill_2)
data_comp_2 <- cbind(data_2, WIND_CHILL_2)

WIND_CHILL_3 <- data_3$DRY_BULB_TEMP
data_comp_3 <- cbind(data_3, WIND_CHILL_3)

2 个答案:

答案 0 :(得分:1)

如果编写向量化函数,则不需要循环(*apply函数是循环)。您还应该研究R中变量作用域的主题。

#some data
set.seed(42)
DF <- data.frame(DRY_BULB_TEMP = runif(100, -10, 30),
                 WIND_SPEED = runif(100, 0, 10))

windchill_1 <- function(temp, wind){ 
#note how I use the function's arguments inside the function
  result <- 13.12 + 0.6215 * temp - 11.37 * (wind ^ (0.16)) + 0.3965* 
    temp * (wind ^ (0.16))
  return(result)
}

windchill_2 <- function(temp, wind){
  result <- temp + ((-1.59 + 0.1345 * (temp) / 5 * wind))
  return(result)
}

windchill <- function (temp, V) {
  #you could nested ifelse here, but this is more efficient:
  wc <- temp
  wc[V >= 5] <- windchill_1(temp[V >= 5], V[V >= 5])
  wc[V > 1 & V < 5] <- windchill_2(temp[V > 1 & V < 5], V[V > 1 & V < 5])
  wc
}

DF <- within(DF, wchill <- windchill(DRY_BULB_TEMP, WIND_SPEED))

head(DF)
#  DRY_BULB_TEMP WIND_SPEED      wchill
#1     26.592242   6.262453 28.53904759
#2     27.483017   2.171577 27.49844851
#3      1.445581   2.165673 -0.06020394
#4     23.217905   3.889450 24.05710651
#5     15.669821   9.424557 15.47513150
#6     10.763838   9.626080  9.60641633

答案 1 :(得分:0)

R提供了许多实现相同结果的方法。我对这个的看法可能就像

windchill <- function(temp, wind, lower=1, upper=5){
    ifelse(wind < lower, temp, 
       ifelse(wind < upper, temp + ((-1.59 + 0.1345 * (temp) / 5 * wind)), 
           13.12 + 0.6215*temp - 11.37*(wind^(0.16)) + 0.3965*temp*(wind^(0.16)) ) )
    }

data$WIND_CHILL <- windchill(data$DRY_BULB_TEMP, data$WIND_SPEED) 

head(data)