which.min 按行不申请
which.min by row without apply
我确信会存在类似的东西(按照 rowSums
等),但我找不到任何东西。基本上,这样做:
apply(mx, 1, which.min)
不使用 apply
这样我们就可以避免调用 which.min
nrow(mx)
次的开销,这可能是一个很大的数目。
感谢@user20650 的回答:
set.seed(1)
mx <- matrix(runif(1e7), ncol=5)
与apply
:
system.time(which.min.mx <- apply(mx, 1, which.min))
# user system elapsed
# 4.7 0.0 4.7
与 max.col
:
system.time(mx.mins.2 <- max.col(-mx, ties="first"))
# user system elapsed
# 0.12 0.00 0.13
all.equal(which.min.mx, mx.mins.2)
# [1] TRUE
旧答案:这是我想到的最好的答案。希望有人有更好的东西,比如内置的 row.which.min
或类似的东西。数据:
使用pmin
、==
、%%
和一些向量回收:
system.time({
row.min <- do.call(pmin, as.data.frame(mx))
mx.mins <- which(t(mx == row.min)) %% ncol(mx)
mx.mins[!mx.mins] <- ncol(mx)
})
# user system elapsed
# 0.51 0.00 0.51
all.equal(which.min.mx, mx.mins)
# [1] TRUE
更不用说这种如果连续出现多个最小值就一败涂地的情况。
我确信会存在类似的东西(按照 rowSums
等),但我找不到任何东西。基本上,这样做:
apply(mx, 1, which.min)
不使用 apply
这样我们就可以避免调用 which.min
nrow(mx)
次的开销,这可能是一个很大的数目。
感谢@user20650 的回答:
set.seed(1)
mx <- matrix(runif(1e7), ncol=5)
与apply
:
system.time(which.min.mx <- apply(mx, 1, which.min))
# user system elapsed
# 4.7 0.0 4.7
与 max.col
:
system.time(mx.mins.2 <- max.col(-mx, ties="first"))
# user system elapsed
# 0.12 0.00 0.13
all.equal(which.min.mx, mx.mins.2)
# [1] TRUE
旧答案:这是我想到的最好的答案。希望有人有更好的东西,比如内置的 row.which.min
或类似的东西。数据:
使用pmin
、==
、%%
和一些向量回收:
system.time({
row.min <- do.call(pmin, as.data.frame(mx))
mx.mins <- which(t(mx == row.min)) %% ncol(mx)
mx.mins[!mx.mins] <- ncol(mx)
})
# user system elapsed
# 0.51 0.00 0.51
all.equal(which.min.mx, mx.mins)
# [1] TRUE
更不用说这种如果连续出现多个最小值就一败涂地的情况。