1

R 初心者からのもう 1 つの基本的な質問です。私はデータセットを持っています: testMeanSD. dput() を使用した関連データを次に示します。出力にこれを試すのは初めてなので、正しく実行できたことを願っています。

testMeanSD <- structure(list(RT = c(1245L, 1677L, 1730L, 1066L, 994L), mean = c(1143.77777777778, 
1143.77777777778, 1143.77777777778, 1143.77777777778, 1143.77777777778
), sd = c(202.255299928596, 202.255299928596, 202.255299928596, 
202.255299928596, 202.255299928596), RT2 = c(1245L, 1677L, 1730L, 
1066L, 994L)), .Names = c("RT", "mean", "sd", "RT2"), row.names = c(NA, 
5L), class = "data.frame")

RT2 は、修正するための RT の単なる複製です。各行について、特定の条件を満たす場合は RT2 の値を変更する必要があります。それ以外の場合、RT2 は RT と同じままです (または RT2 の現在の値と同じです)。条件は次のとおりです。

  1. Mean + 2.5 * SD を超える RT2 のすべての値を見つけ、Mean + 2.5 * SD に等しくなるようにトリムします

    もし (RT2 > 平均 + (2.5 * SD)) RT2 = 平均 + 2.5 * SD

  2. Mean - SD の 2.5 倍より小さいすべての値を見つけ、Mean - 2.5 * SD に等しくなるようにそれらをトリミングします。

    そうでない場合 (RT2 < 平均値 - (2.5 * SD)) RT2 = 平均値 - 2.5 * SD

  3. それ以外はそのまま

    それ以外の
    場合 RT2 = RT

これはRではかなり基本的なことだと思いましたが、それを機能させる方法が見つかりません。ここに私の試みのいくつかがあります(すべて失敗しました):

初め:

testMeanSD$RT2 = testMeanSD$RT
if (testMeanSD$RT2 > (testMeanSD$mean + (2.5 * testMeanSD$sd))) {
    testMeanSD$RT2 = (testMeanSD$mean + (2.5 * testMeanSD$sd))
}
else if(testMeanSD$RT2 < (testMeanSD$mean - (2.5 * testMeanSD$sd))) {
    testMeanSD$RT2 = (testMeanSD$mean - (2.5 * testMeanSD$sd))
}
else {
    testMeanSD$RT2 = testMeanSD$RT
}

2番:

ifelse(testMeanSD$RT2 > (testMeanSD$mean + (2.5 * testMeanSD$SD)), testMeanSD$RT2 <- (testMeanSD$mean + (2.5 * testMeanSD$sd)),
    ifelse(testMeanSD$RT2 < (testMeanSD$Mean - (2.5 * testMeanSD$sd)), testMeanSD$RT2 <- (testMeanSD$mean - (2.5 * testMeanSD$sd)), testMeanSD$RT2 <- testMeanSD$RT)

三番:

testMeanSD$RT2 <- ifelse(testMeanSD$RT2 > (testMeanSD$mean + (2.5 * testMeanSD$sd)), testMeanSD$mean + (2.5 * testMeanSD$sd)),
   ifelse(testMeanSD$RT2 < (testMeanSD$mean - (2.5 * testMeanSD$SD)), (testMeanSD$mean - (2.5 * testMeanSD$sd)), testMeanSD$RT2 <- testMeanSD$RT)

私はいくつかの関連記事を調べましたが、これが最も近いと思われます: Loop over rows of dataframe applied function with if-statement

しかし、そこに概説されているアプローチに if then を組み込む方法は私には明確ではありません(上記のようではない場合)。

どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

4

ベクトル化された条件と代入を優先して、ループと if ステートメントを避けたいと思うことはほぼ間違いありません。

if (RT2 > Mean + (2.5 * SD)) RT2 = Mean + 2.5 * SDdata.frame が呼び出されると仮定して、最初の例を見てみましょうdat:

sel <- dat$RT2>dat$mean + 2.5*dat$SD # creates a boolean of length nrow(dat)
dat$RT2[sel] <- with(dat[sel,], mean + 2.5*SD)

with()「 」の入力の手間を省くために使用できますdat$

NB 再現可能なデータセットがないため、これをテストしていません。ほぼ確実にどこかにタイプミスがあります!

于 2012-08-20T11:36:14.990 に答える