2

我有一个由 ntraj 行和 91 列组成的数据框(maturGI)。我想保存与给定行的值第一次优于阈值(此处:27.66)相对应的位置索引。

我尝试了以下脚本

    for(i in 1:ntraj) {
    z <- min(which((maturGI[i,]>27.66),arr.ind=TRUE))
    print(z)
  }

    trial <- function(x){
  for(i in 1:x) {
    z <- min(which((maturGI[i,]>27.66),arr.ind=TRUE))
    rbind(z)
  }
  return(data.frame(cbind(z)))
}

然而,它只保存了与最后一行相对应的值,而不是整个序列。我怎样才能做到?

4

1 回答 1

4

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 == 0and (TRUE == 1及其which.max表亲which.min())返回取最大值(或最小值)的任何值中的第一个。因此

> apply(df > 0.25, 1, which.max)
 [1] 1 2 2 3 1 3 1 2 1 2

这很简洁......

于 2013-07-31T19:22:39.197 回答