z
您在每次迭代时都覆盖。z
显而易见的解决方案是在开始循环之前使足够大以容纳结果,并将每个结果分配给z
. 例如
z <- numeric(length = ntraj)
for(i in seq_len(ntraj)) {
z[i] <- min(which(maturGI[i,] > 27.66, arr.ind = TRUE))
}
z
当然,您可以在不循环的情况下执行此操作,因此不必担心存储问题。此外,您可以一步计算出符合您的标准 ( > 27.66 ) 的整个索引集。例如,使用一些虚拟数据,获取值 > 0.25 的最小列索引。
df <- data.frame(matrix(runif(100), ncol = 10)) ## dummy data
您可以一次性计算整个索引向量
> df > 0.25
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
[1,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[2,] FALSE TRUE FALSE FALSE TRUE TRUE FALSE TRUE TRUE TRUE
[3,] FALSE TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE
[4,] FALSE FALSE TRUE TRUE FALSE TRUE TRUE TRUE FALSE TRUE
[5,] TRUE TRUE TRUE FALSE TRUE FALSE TRUE TRUE TRUE FALSE
[6,] FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[7,] TRUE FALSE FALSE FALSE TRUE TRUE TRUE FALSE TRUE TRUE
[8,] FALSE TRUE FALSE FALSE TRUE FALSE TRUE TRUE TRUE TRUE
[9,] TRUE TRUE TRUE TRUE FALSE TRUE TRUE FALSE FALSE TRUE
[10,] FALSE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE FALSE
并在apply()
通话中使用它。你的循环的直接翻译是
> apply(df > 0.25, 1, function(x) min(which(x, arr.ind = TRUE)))
[1] 1 2 2 3 1 3 1 2 1 2
但更简单的解决方案是使用which.max()
,注意FALSE == 0
and (TRUE == 1
及其which.max
表亲which.min()
)返回取最大值(或最小值)的任何值中的第一个。因此
> apply(df > 0.25, 1, which.max)
[1] 1 2 2 3 1 3 1 2 1 2
这很简洁......