R: использовать цикл для применения формулы, используя 2 переменные из разных наборов данных - PullRequest
0 голосов
/ 13 марта 2012

У меня есть два листа Excel с климатическими данными: температура (dtT) и относительная влажность (dtR).Каждый кадр состоит из 39 строк (сайтов мониторинга) по 64 столбцам (61 день, пронумерованный от 121 до 181, «lat», «lon» и «county»).Оба листа в одном и том же порядке.Я хочу использовать эти два набора данных, чтобы рассчитать «тепловой индекс» для каждого сайта мониторинга каждый день, заполняя еще один кадр данных тех же размеров.

ПРОБЛЕМА: я пытаюсь использовать вложенный цикл, но все значения возвращаются в виде нулей.Может быть потому, что в столбце «county» содержатся слова, R читает все числа в виде символов и поэтому не может выполнять вычисления?(** Указанные столбцы могут показаться запутанными, но я ищу общую стратегию)

dtT <- read.csv("C:/Users/Desktop/Tavg3.csv")
dtR <- read.csv("C:/Users/Desktop/RHavg3.csv")    
# Make a new data frame
hi = cbind(dtT, dtR)
# Add empty columns for heat index
hi[paste("hi",121:181,sep="")] = 0  
# Loop to fill each hi cell using NOAA formula
for(i in 1:length(hi$lat)){
    t <- hi[i, 3:63]
    r <- hi[i, 64:124]
    h <- hi[i, 125:185]
    for(j in 1:length(t)){
        h[i,j] = -42.379 + (2.04901523*t[j]) + (10.14333127*r[j]) - (0.22475541*t[j]*r[j]) - 
                ((6.83783*10^-3)*(t[j]^2)) - ((5.481717*10^-2)*(r[j]^2) ) + ((1.22874*10^3) - (t[j]^2)*r[j]) + ((8.5282*10^-4)*t[j]*(r[j]^2)) - ((1.99*10^-6)*(t[j]^2)*(r[j]^2))
    }
}
hi[1:10, 130:140]
hi = hi[,c(1:2, 125:185]

Ответы [ 2 ]

2 голосов
/ 13 марта 2012

Если data.frames имеют одинаковый размер, столбцы, строки, Вы можете извлечь числовые значения в виде матрицы, и сделайте вычисления на этих двух матрицах.

temperature <- as.matrix(dtT[,4:64]) # Use the correct column numbers
humidity    <- as.matrix(dtR[,4:64])
heat_index <- 
  -42.379 + 
  2.04901523  * temperature + 
  10.14333127 * humidity - 
  0.22475541  * temperature * humidity - 
  6.83783e-3  * temperature^2 - 
  5.481717e-2 * humidity^2 + 
  1.22874e3   * temperature^2 * humidity + 
  8.5282e-4   * temperature * humidity^2 - 
  1.99e-6     * temperature^2 * humidity^2
# Put back the latitude, longitude, county columns 
# (assuming they were the first three)
cbind( dtT[,1:3], heat_index )
1 голос
/ 13 марта 2012

В вашем коде вы обновляете h[i,j], но потом смотрите на hi ... Как выглядит h после цикла for?

Обратите внимание, что изменение h будет не изменять hi, хотя концептуально h является подмножеством hi ...

Возможно, вы могли бы просто заменить h[i,j] = на hi[i,j+124] =

...