R编程
我是一名新的R程序员,试图编写一个脚本,根据不同的风速参数计算具有3个不同方程的windchill。我试图使用apply函数来执行此操作。
摄取的数据是数据帧(csv文件),其中每行是不同的天气观测,包括站名,站ID,时间(年,月,日,小时),然后是气象数据,temp(DRY_BUILB_TEMP)和风速(WIND_SPEED)。计算挡风玻璃只需要温度和风速。
我使用的算法如下:
我的应用函数出现了问题,我只想对数据框中的每一行进行一次响应,即计算该行数据的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)
答案 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)