R逐行查找data.frame中的特定值

时间:2013-07-31 19:18:44

标签: r which

我有一个由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)))
}

然而,它只保存了与最后一行相对应的值而不是整个序列。我该怎么做? 提前致谢!

1 个答案:

答案 0 :(得分: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)的整套索引。例如,使用一些虚拟数据,获取值的最小列索引&gt; 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 == 0TRUE == 1以及which.max(及其堂兄which.min())会返回第一个取最大值(或最小值)的任何值。因此

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

非常简洁......