私は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)
}
}