1

私はRを初めて使用します。解決すべき問題があり、以下の作業関数がそれをうまく解決します(適切な時間で)。しかし、私が R チュートリアルとここ SO で読んでいることから、私はそれを解決するためにあまりにも多くの仕事をしているように感じます。これをすべて数行に折りたたむための派手な R の方法はありますか?

解決する問題: 文字データのデータの CSV ファイルと "flag" 引数を指定して、位置 [row, 1] の値を抽出します。「行」は、「フラグ a」の列「InterestingColumn」の最小値、「フラグ b」の列「Interesting Column」の最大値、または数値の「フラグ」で定義された n 番目の値になるように計算されます。出力は、「InterestingColumn」の一意の値でグループ化する必要があります。返される結果はデー​​タ フレームである必要があります。列のスキーマはわかっていますが、ファイルの長さはわかっていません。

私の本能は、for ループを完全に取り除くことができるはずであり、毎回 rbind を使用した行列の再構築は非効率的であるということです (このように? )

myfunc <- function(flag = "a") {
   csv <- read.csv("data.csv", colClasses = "character")
   col <- unique(csv$InterestingColumn)
   output <- NULL

   for (i in 1:length(col)) {
      sub <- subset(csv, InterestingColumn == col[i])
      vals <- as.numeric(sub[, 12])

      if (flag == "a") {
         output <- rbind(output, matrix(c(sub[which.min(vals),1], col[i]), ncol = 2))
      }
      else if (flag == "b") {
         output <- rbind(output, matrix(c(sub[which.max(vals),1], col[i]), ncol = 2))
      }
      else if (is.numeric(flag)) {
         output <- rbind(output, matrix(c(sub[flag,1], col[i]), ncol = 2))
      }

      colnames(output) <- c("data", "col")
      as.data.frame(output)
   }
}
4

1 に答える 1

0

列 12 の名前が であるとしCol12ます。それなら順調aggregateかもしれません。関数内の呼び出しの後のすべてはread.csv、次の式で処理する必要があります (ただし、結果のデータ フレームの名前を設定したい場合があります)。

aggregate(Col12 ~ InterestingColumn, data=csv, FUN=function(x) {
  if (flag == "a") {
    min(x);
  } else if (flag == "b") {
    max(x);
  } else if (is.numeric(flag)) {
    x[flag];
  }
})
于 2014-06-04T02:31:06.650 に答える