簡単な免責事項 - 私は数日前に R を手に入れたばかりで、プログラミングの経験はほとんどなかったので、この質問がばかげていたり、コードがひどいように見えたりしたら、申し訳ありません。(おそらくそうです)。
コードに!そこで、このブログのコードを使用して、天気に基づいた楽しい統計モデリングを試すために再利用しました。
気象データをプルダウンするために作成した関数は次のようになります。
getHistoricalWeather <- function(weatherstation, senddate) {
base.url <- 'http://api.wunderground.com/api/{MY API IS HERE}/'
final.url <- paste(base.url, 'history_', senddate, '/q/', weatherstation, '.json',sep='')
conn <- url(final.url)
raw.data <- readLines(conn, n=-1L, ok=TRUE)
weather.data <- fromJSON(paste(raw.data, collapse=""))
close(conn)
return(weather.data)
}
その後、10 の別々の日付をループして、それらの日付ごとに気象データを取得し、特定の時間、平均湿度、総降水量に基づいて平均気温を見つけようとしています。これらの日付は、checkdate という変数に保存されます。
checkdate
[1] "20130628" "20130611" "20130612" "20130613" "20130614" "20130615" "20130616" "20130617" "20130618" "20130619"
特定の情報を除外する関数は次のようになります。
atwaters_cleanup <- function() {
average_temperature <- 0
average_hum <- 0
total_precipi <- 0
for (i in seq_along(gotweatherdata$history$observations)) {
if (as.numeric(gotweatherdata$history$observations[[i]]$date$hour) >= 6 && as.numeric(gotweatherdata$history$observations[[i]]$date$hour) < 18) {
average_temperature <- c(average_temperature,as.numeric(gotweatherdata$history$observations[[i]]$tempi))
average_hum <- c(average_temperature,as.numeric(gotweatherdata$history$observations[[i]]$hum))
if (as.numeric(gotweatherdata$history$observations[[i]]$precipi) > 0) {total_precipi <- c(total_precipi,as.numeric(gotweatherdata$history$observations[[i]]$precipi))}
}
}
average_temperature <- sum(average_temperature) / length(average_temperature)
average_hum <- sum(average_hum) / length(average_hum)
total_precipi <- sum(total_precipi)
return(c(average_temperature, average_hum, total_precipi))
}
最後に、問題の for ループは次のようになります。
pull_day <- function() {
atwaters_historical_data <- data.frame()
for (i in 1:length(checkdate)) {
gotweatherdata <- getHistoricalWeather("KBWI",checkdate[i])
atwaters_historical_data <- rbind(atwaters_historical_data, atwaters_cleanup())
}
return(atwaters_historical_data)
}
ただし、私が直面している問題は、for ループが同じ日の 10 個のインスタンスしか返さないように見えることです。
X70.9642857142857 X69.8333333333333 X0
1 70.96429 69.83333 0
2 70.96429 69.83333 0
3 70.96429 69.83333 0
4 70.96429 69.83333 0
5 70.96429 69.83333 0
6 70.96429 69.83333 0
7 70.96429 69.83333 0
8 70.96429 69.83333 0
9 70.96429 69.83333 0
10 70.96429 69.83333 0
しかし、for ループの外で同じコマンドを手動で試すと、正しく動作しているように見えます。この例では、checkdate[1] を checkdate[2] に変更しています。
> gotweatherdata <- getHistoricalWeather("KBWI",checkdate[1])
> atwaters_historical_data <- rbind(atwaters_historical_data,atwaters_cleanup())
> atwaters_historical_data
X74.2153846153846 X74.5571428571428 X0.02
1 74.21538 74.55714 0.02
> gotweatherdata <- getHistoricalWeather("KBWI",checkdate[2])
> atwaters_historical_data <- rbind(atwaters_historical_data,atwaters_cleanup())
> atwaters_historical_data
X74.2153846153846 X74.5571428571428 X0.02
1 74.21538 74.55714 0.02
2 70.96429 69.83333 0.00
for ループをテストしてみましたが、正しい数値が checkdate[x] (1 から 10) に差し込まれていることは確かですが、同じ結果が繰り返し得られます。申し訳ありませんが、これは混乱しているように見えます。事前に助けてくれてありがとう!