0

いくつかのサンプル データ:

ID        S1Qual    S2Qual    S3Qual    S1        S2        S3
1         1         0         1         7         8         7
2         1         1         1         6         6         8
3         0         1         1         7         8         8
...

S1Qual、S2Qual、S3Qual は、それぞれ S1PS、S2PS、S3PS の品質を表します。もし[n, S1Qual] == 1、私は保持したいです[n, S1PS]。なら[n,S1Qual] == 0、設定したい[n,S1PS] == NA

次のコードがあります。

n <- 1

while (n <= number.of.rows) {

    if (data$S1Qual[n] == 0) {data$S1[n] <- NA}
    if (data$S2Qual[n] == 0) {data$S2[n] <- NA}
    if (data$S3Qual[n] == 0) {data$S3[n] <- NA}


  n <- n+1

}

これは私が望んでいたことですが、より効率的で簡潔な方法があることを望んでいました (実際のデータフレームには、これらの S/SQual ペアが 3 つ以上あります)。周りを検索するifelse()apply()、 と にたどり着きました。どちらも近いように見えますが、間違っていると考えていない限り、私が望むものにはあまり適していません。

何か案は?

4

3 に答える 3

2

Use this:

cols <- paste0("S", 1:3)
data[,cols][data[,paste0(cols,"Qual")]==0] <- NA

Note: change the vector 1:3 to match your actual number of columns.

于 2013-09-05T19:15:52.067 に答える
1

物事をシンプルに保つと、R コードを理解しやすくなります。そして、すべてを忘れてしまった未来の私を助けてくれます。

コピーを作成し、ゼロに等しい項目を簡単に置き換えることができます (これはフェルディナンドが行ったことです... 彼はより賢いです):

data1 <- data[,c(2:4)]
data2 <- data[,c(5:7)]
data2[data1==0] <- NA
data[,c(5:7)] <- data2

説明のために編集:

最初の 2 行は、等次元のデータ フレームを作成します。それらは同じ次元を持っているため、data1参照元のインデックスを使用できますdata2

魔法は 3 行目で発生します (技術的にはフィルタリングと呼ばれます)。の要素data1が 0 の場合は TRUE を返し、それ以外の場合は FALSE を返します。3 行目には、「 の要素data1が 0 の場合、 からそのインデックスを返す」と書かれていますdata2。たとえば、上記の例のデータを使用して、 の要素data1[1,2]がゼロ (ゼロ) の場合、 NA を に割り当てdata2[1,2]ます。

最後の行は、古い 3x3 サブマトリックスを新しいものに置き換えます。

于 2013-09-05T19:22:13.303 に答える