我有一个 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)))
期望的输出: 通过,通过,失败,失败
最佳答案
使用all
和apply
(尽管apply
使用它自己的循环)。
m <- as.matrix(rbind(c(129,129,120),c(135,97,96),c(0,0,0),c(39,4,2)))
apply(m, 1, function(x) all(x > 3))
# [1] TRUE TRUE FALSE FALSE
如果您确实想要“PASS”和“FAIL”,您可以factor
apply
步骤的结果。
factor(apply(m, 1, function(x) all(x > 3)),
levels = c(FALSE, TRUE),
labels = c("FAIL", "PASS"))
# [1] PASS PASS FAIL FAIL
# Levels: FAIL PASS
<小时/>
稍微扩展 Codoremifa 的答案,类似的方法适用于 data.table
,特别是当您指定想要一个向量或因子作为输出时。
library(data.table)
DT <- data.table(m)
DT[, all(.SD > 3), by = 1:nrow(DT)][, factor(V1, labels = c("FAIL", "PASS"))]
# [1] PASS PASS FAIL FAIL
# Levels: FAIL PASS
关于r - 如何根据逻辑从数值矩阵生成向量或因子(无 for 循环),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19525065/