3

私はRにかなり慣れておらず、一般的に自分は初心者プログラマーだと考えていると言うことから始めましょう...だから私が何をしているのか知っていると思い込まないでください:)

私は約300,000x14の大きなマトリックスを持っています。これは、基本的に15分のデータの20年のデータセットです。ただし、REC.TYPEという名前の列に文字列「SAO」または「FL-15」が含まれている行のみが必要です。

私のひどく非効率的な解決策は、行ごとに行列を検索し、REC.TYPE列をテストし、基準に一致しない場合は基本的に行を削除することでした。本質的に...

   j <- 1
   for (i in 1:nrow(dataset)) {
      if(dataset$REC.TYPE[j] != "SAO  " && dataset$RECTYPE[j] != "FL-15") {
        dataset <- dataset[-j,]  }
      else {
        j <- j+1  }
   }

コードが1時間でマトリックスの約10%しか通過せず、すべての行で速度が低下するのを確認した後、必要なレコードのみを引き出すためのより効率的な方法が必要だと思います...特に繰り返す必要がある場合これは別の8つのデータセット用です。

誰かが私を正しい方向に向けることができますか?

4

3 に答える 3

4

正規表現が必要です。大文字と小文字が区別されます(以下に示すように)。

x <- c("ABC", "omgSAOinside", "TRALAsaoLA", "tumtiFL-15", "fl-15", "SAOFL-15")
grepl("SAO|FL-15", x)
[1] FALSE  TRUE FALSE  TRUE FALSE  TRUE

あなたの場合、私はします

subsao <- grepl("SAO", x = dataset$REC.TYPE)
subfl <- grepl("FL-15", x = dataset$RECTYPE)
#mysubset <- subsao & subfl # will return TRUE only if SAO & FL-15 occur in the same line
mysubset <- subsao | subfl # will return TRUE if either occurs in the same line
dataset[mysubset, ]
于 2013-03-03T06:25:32.530 に答える
4

投稿したコードからはわかりませんが、データがすでにdata.frameにある場合は、これを直接行うことができます。そうでない場合は、最初にを実行しdataset <- data.frame(dataset)ます。

そこから:

dataset[dataset$REC.TYPE == "SAO  " | dataset$RECTYPE == "FL-15",]

あなたが探しているものを返す必要があります。ForループはRではひどく非効率的です。Rチュートリアルを読み終えると、Rインフェルノはいくつかの一般的な落とし穴を回避する方法を教えてくれます。

この特定の行が機能する方法は、条件に一致する行のみを返すことにより、データフレームをフィルタリングすることです。?[詳細については、Rインターペッターに入力できます。

于 2013-03-03T06:26:23.903 に答える
3

他のポスターが言ったように、サブセット[操作を繰り返すのは遅いです。代わりに、ベクトル全体で動作する関数が推奨されます。

あなたの両方の基準が影響すると思いますREC.TYPE。私のソリューションは関数を使用します%in%:

dataset <- dataset[dataset$REC.TYPE %in% c("SAO","FL-15"),]
于 2013-03-03T06:42:24.323 に答える