我有一个由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)))
}
然而,它只保存了与最后一行相对应的值而不是整个序列。我该怎么做? 提前致谢!
答案 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 == 0
和TRUE == 1
以及which.max
(及其堂兄which.min()
)会返回第一个取最大值(或最小值)的任何值。因此
> apply(df > 0.25, 1, which.max)
[1] 1 2 2 3 1 3 1 2 1 2
非常简洁......