gpt4 book ai didi

根据先前列的覆盖范围重新排列列

转载 作者:行者123 更新时间:2023-12-04 21:30:37 26 4
gpt4 key购买 nike

我正在进行测试覆盖率分析,我想重新排列一个矩阵,以便按“附加”测试失败的数量对列进行排序。

例如,我有一个包含 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 循环?

谢谢。

最佳答案

这是一种与 OP 有点类似的方法,但我希望它的性能会稍微好一些(虽然未经测试):

select_cols <- names(tail(sort(colSums(df)), 1)) # first col
for(i in seq_len(ncol(df)-1)) {
remaining_cols <- setdiff(colnames(df), select_cols)
idx <- rowSums(df[, select_cols, drop=FALSE]) > 0
select_cols <- c(select_cols,
names(tail(sort(colSums(df[!idx, remaining_cols, drop=FALSE])), 1)))
}
df <- df[, select_cols]
df

# t2 t3 t1
# [1,] TRUE FALSE TRUE
# [2,] TRUE FALSE TRUE
# [3,] TRUE FALSE TRUE
# [4,] TRUE FALSE TRUE
# [5,] TRUE FALSE TRUE
# [6,] TRUE FALSE TRUE
# [7,] TRUE FALSE FALSE
# [8,] TRUE TRUE FALSE
# [9,] FALSE TRUE FALSE
# [10,] FALSE TRUE FALSE

更新:试试这个稍微修改过的版本 - 它要快得多,我认为它会产生正确的结果:
  select_cols <- names(tail(sort(colSums(m)), 1)) # first col
idx <- rowSums(m[, select_cols, drop = FALSE]) > 0
for(i in seq_len(ncol(m)-1)) {
remaining_cols <- setdiff(colnames(m), select_cols)
idx[!idx] <- rowSums(m[!idx, select_cols, drop=FALSE]) > 0
select_cols <- c(select_cols,
names(tail(sort(colSums(m[!idx, remaining_cols, drop=FALSE])), 1)))
}
m <- m[, select_cols]
m

两者之间的主要区别在于这一行:
idx[!idx] <- rowSums(m[!idx, select_cols, drop=FALSE]) > 0

这意味着我们不需要为之前选择的任何列已经为真的行计算 rowSums。

关于根据先前列的覆盖范围重新排列列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53152424/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com