1

更新: 私の NOAA GHCN-Daily ウェザー ステーション データ関数はクリーンアップされ、rnoaaパッケージに統合されました。CRAN またはこちらから入手できます: https://github.com/ropensci/rnoaa

複数のデータ フレームで構成されるデータ セット全体の統計を計算する R 関数を設計しています。つまり、名前を含む参照データ フレームに基づいて、クラスごとにデータ フレームをプルしたいと考えています。次に、特定の日ごとにリストされたメトリックの値に統計関数を適用したいと考えています。実際には、データ フレームのリストを呼び出してオーバーレイし、値が NA ではないすべての一意の日付とメトリックの値のベクトルで関数を計算したいと考えています。

データ フレームは、'by' 関数を使用して、クラス変数に基づいてファイルからワークスペースに繰り返し読み込まれます。特定のクラスのファイルをインポートした後、そのクラスのデータ フレームと、ある範囲内の各ユーザー定義メトリックを rbind() したいと考えています。次に、ユーザー提供の統計関数の連結を、年、月、日の特定の値に対応するクラス内の各メトリックに適用したいと考えています (つまり、7 月 1 日の平均 [関数] 低温 [クラス]、 1990 [日付] は、特定の地域 [クラス] 内のすべての場所 [データ フレーム] にわたって報告されました.最終結果は、地域内のすべての日付の値と、適用される各メトリックおよび統計関数の年の範囲を含む新しいデータ フレームにしたいと考えています。私は、aggregate() 関数を使用してこの結果を得るのに非常に近づいています。しかし、平均温度以外のほとんどの関数に対して現在 NA と NaN を出力している集計関数から妥当な結果を得るのに問題があります。どんなアドバイスでも大歓迎です!これまでの私のコードは次のとおりです。

# Example parameters
w <- c("mean","sd","scale")             # Statistical functions to apply
x <- "C:/Data/"                         # Folder location of CSV files
y <- c("MaxTemp","AvgTemp","MinTemp")   # Metrics to subset the data
z <- c(1970:2000)                       # Year range to subset the data

 CSVstnClass  <- data.frame(CSVstations,CSVclasses)

  by(CSVstnClass, CSVstnClass[,2], function(a){                        # Station list by class
  suppressWarnings(assign(paste(a[,2]),paste(a[,1]),envir=.GlobalEnv))
    apply(a, 1, function(b){                                           # Data frame list, row-wise
      classData   <- data.frame()
      sapply(y, function(d){                                           # Element list
        CSV_DF    <- read.csv(paste(x,b[2],"/",b[1],".csv",sep=""))    # Read in CSV files as data frames
        CSV_DF1   <- CSV_DF[!is.na("Value")]
        CSV_DF2   <- CSV_DF1[which(CSV_DF1$Year %in% z & CSV_DF1$Element == d),]
        assign(paste(b[2],"_",d,sep=""),CSV_DF2,envir=.GlobalEnv)

        if(nrow(CSV_DF2) > 0){                                         # Remove empty data frames
          classData <<- rbind(classData,CSV_DF2)                       # Bind all data frames by row for a class and element
          assign(paste(b[2],"_",d,"_bound",sep=""),classData,envir=.GlobalEnv)

          sapply(w, function(g){                                       # Function list
                                                                       # Aggregate results of bound data frame for each unique date
            dataFunc <- aggregate(Value~Year+Month+Day+Element,data=classData,FUN=g,na.action=na.pass)
            assign(paste(b[2],"_",d,"_",g,sep=""),dataFunc,envir=.GlobalEnv)
            })
        }
        })
      })
    })

私はかなり近いと思いますが、 rbind() が適切に実行されているかどうか、また、aggregate() 関数が非常に多くのメトリックに対して NA と NaN を出力している理由もわかりません。データ フレームが結合されていないか、一部の統計関数で欠損値が適切に処理されていないことが懸念されました。あなたが提供できるアドバイスを事前に感謝します。

乾杯、

アダム

4

1 に答える 1

2

デバッグが非常に困難になるような方法でこの問題に取り組みました。各ステップをより簡単に確認できるように、物事を切り替えることをお勧めします。(有益な変数名を使用することも役立ちます!) コードはそのままでは機能しそうにありませんが、次のステップに進む前に各ステップが成功したことを確認して、繰り返し作業する方がはるかに簡単です。

paths <- dir("C:/Data/", pattern = "\\.csv$")

# Read in CSV files as data frames
raw <- lapply(paths, read.csv, str)

# Extract needed rows
filter_metrics <- c("MaxTemp", "AvgTemp", "MinTemp")
filter_years <- 1970:2000
filtered <- lapply(raw, subset, 
  !is.na(Value) & Year %in% filter_years & Element %in% filter_metrics)

# Drop any empty data frames
rows <- vapply(filtered, nrow, integer(1))
filtered <- filtered[rows > 0]

# Compute aggregates
my_aggregate <- function(df, fun) {
  aggregate(Value ~ Year + Month + Day + Element, data = df, FUN = fun, 
    na.action = na.pass)
}    
means <- lapply(filtered, my_aggregate, mean)
sds <- lapply(filtered, my_aggregate, sd)
scales <- lapply(filtered, my_aggregate, scale)
于 2013-08-01T12:40:27.847 に答える