3

30,000 行 3 列の数値行列があります。マトリックスの各行の 3 つの値に基づいて、単純な合格/不合格ベクトル (または係数) を生成したいと思います。次のロジックを適用したいと思います。

行の 3 つの値がすべて > 3 の場合は PASS と入力し、それ以外の場合は FAIL と入力します。

forループでこれを行う方法は知っていますが、どうすればより速く実行できますか? 私はこれらの行列を何十も持っています...ありがとう!

as.matrix(rbind(c(129,129,120),c(135,97,96),c(0,0,0),c(39,4,2)))

希望する出力: PASS、PASS、FAIL、FAIL

4

5 に答える 5

4

ここでの他の回答とは異なり、これは使用しますrowSumsが、R でのループではなく、複数のサブセットと論理を追い越す可能性があります。おそらく最速のルートです。

mat <- as.matrix(rbind(c(129,129,120),c(135,97,96),c(0,0,0),c(39,4,2)))

vec <- ifelse(rowSums(mat > 3) == 3, TRUE, FALSE)

バイパスifelseしてさらに高速化することもできます。

vec <- rowSums(mat > 3) == 3

これらを時間をかけてテストすると、おそらく勝者になります。私のシステムでは、30,000 行の行列を使用して、最初の回答はガン回答の約 2 倍の速さで出てきます。2 番目の回答は 10 倍の速さで出てきて、1000 30,000 行の行列を約 2 秒で実行できます。コドレミファの回答は、ここでの最速data.tableベースの回答であり、20 秒かかります (ガンの回答と同様)。

:「合格」、「不合格」ベクトルの要求を無視しました。速度が最も重要であり、それは些細な意味論的区別であることを示しているように見えたからです。さらに、論理ベクトルは、必要に応じて行列をサブセット化するために既に準備されています。

于 2013-10-22T18:30:25.040 に答える
2

また、mapply:

mat <- as.matrix(rbind(c(129,129,120),c(135,97,96),c(0,0,0),c(39,4,2)))

fun <- function(x, y, z) { ifelse(x > 3 & y > 3 & z > 3, "PASS", "FAIL") } 
mapply(fun, mat[,1], mat[,2], mat[,3])
#[1] "PASS" "PASS" "FAIL" "FAIL"
于 2013-10-22T18:08:55.567 に答える
2
library(data.table)
dt <- as.matrix(rbind(c(129,129,120),c(135,97,96),c(0,0,0),c(39,4,2)))

dt <- data.table(dt)
dt[, Indicator :="FAIL"]
dt[V1 > 3 & V2 >3 & V3 >3, Indicator :="PASS" ]
于 2013-10-22T18:01:11.170 に答える