【发布时间】:2018-11-05 10:22:54
【问题描述】:
我正在进行测试覆盖率分析,我想重新排列一个矩阵,以便按“额外”测试失败的数量对列进行排序。
例如,我有一个 TRUE 和 FALSE 矩阵,其中 TRUE 表示失败。
df <- structure(c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE), .Dim = c(10L, 3L), .Dimnames = list(NULL, c("t1", "t2", "t3")))
t2 的失败次数最多,应该是第一列。 t1 次之,但它的所有故障(每行)都被 t2 覆盖。然而,t3 的失败次数较少,但最后两次失败没有被 t2 覆盖,因此应该是第二列。
基于故障覆盖率的所需列顺序:
df <- structure(c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE), .Dim = c(10L, 3L), .Dimnames = list(NULL, c("t2", "t3", "t1")))
我能够使用 for 循环和 apply 函数来计算每次测试的“额外”失败次数,但是当数据集中有很多列和行时,性能真的很差。但是,我更喜欢重新排列该列以进行进一步处理。
for (n in 2:ncol(out)) {
idx <- which.max(apply(out, 2, sum, na.rm = T))
col.list <- c(col.list, names(idx))
val.list <- c(val.list, sum(out.2[ ,idx], na.rm = T))
out[out[ ,idx] == T, ] <- F
out <- out[ ,-idx]
}
谁能提出更好的方法来做到这一点?也许不使用 for 循环?
谢谢。
【问题讨论】: