0

私は R に比較的慣れておらず、データ フレームに格納されている大量の気象データを処理しようとしています。私の目標は、データをループして、データ フレームの Element 列をいくつかの値と比較することです。従来の switch ステートメントのように、Element の値に応じて別のことを行う予定です。要素の値は、TMAX や TMIN などの 24 の異なる値のいずれかになります。現在、要素列は 24 レベルの因子です。Element の値に応じて異なるコード セットを実行して、このデータをループする最速の方法は何ですか? Element の値を比較して、たとえば TMAX と等しいかどうかを確認するにはどうすればよいですか? 効率は非常に重要です。任意の提案をいただければ幸いです。

例:

library("sqldf")
library("RPostgreSQL")

width = c(11, 4, 2, 4)
label = c("ID", "Year", "Month", "Element")
for (i in 1:31)
{
  width = c(width, 5, 1, 1, 1)
  label = c(label, paste("Value ",i), paste("MFLAG ",i), paste("QFLAG ",i), paste("SFLAG", i))
}
test = read.fwf("ftp://ftp.ncdc.noaa.gov/pub/data/ghcn/daily/all/USW00093734.dly", header = FALSE, fill = TRUE, widths = width, col.names = label)

#You need to set up your database for this to work
for(i in 1:length(test$ID))
{
  if(as.character(test$Element) == "TMAX")
  {
    for(j in 1:31)
    {
      insert_statement = paste("INSERT into noaa_temperature (id, max_temp, date) values (", test$ID[[i]],",",test[paste("Value..",j)],toString(as.Date(ISOdate(test$Year,test$Month,j))),")")
      sqldf(insert_statement)
    }
  }
  if((as.character(test$Element) == "WT01") || (as.character(test$Element) == "WT03")
  {
    for(j in 1:31)
    {
      if(test[paste("Value..",j)] == 1)
      {
        insert_statement = paste("INSERT into noaa_weather_type (id, code, date) values (", test$ID[[i]],",",toString(test$Element),toString(as.Date(ISOdate(test$Year,test$Month,j))),")")
        sqldf(insert_statement)
      }
    }
  }
}

テストの Element 列の値に応じて、各行で異なるコード セクションを実行したいと思います。

4

0 に答える 0