在矩阵中找到第一个正数

时间:2018-04-06 08:21:10

标签: r matrix subset which

我试图在矩阵的每一行中找到第一个正数或非零数。

这里我尝试复制我的数据集:

x <- matrix(0,10,13)
y <- seq(1,10,1)
set.seed(1)

for(i in 1:10){
    x[y[i],c(y[i]:(y[i]+3))] <- runif(1,min = .5)
}

因此,数据如下:

           [,1]      [,2]      [,3]      [,4]      [,5]      [,6]      [,7]      [,8]      [,9]     [,10]     [,11]     [,12]    [,13]
 [1,] 0.6184363 0.6184363 0.6184363 0.6184363 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000
 [2,] 0.0000000 0.8788976 0.8788976 0.8788976 0.8788976 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000
 [3,] 0.0000000 0.0000000 0.9090922 0.9090922 0.9090922 0.9090922 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000
 [4,] 0.0000000 0.0000000 0.0000000 0.7781090 0.7781090 0.7781090 0.7781090 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000
 [5,] 0.0000000 0.0000000 0.0000000 0.0000000 0.5780575 0.5780575 0.5780575 0.5780575 0.0000000 0.0000000 0.0000000 0.0000000 0.000000
 [6,] 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.9093576 0.9093576 0.9093576 0.9093576 0.0000000 0.0000000 0.0000000 0.000000
 [7,] 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.5096778 0.5096778 0.5096778 0.5096778 0.0000000 0.0000000 0.000000
 [8,] 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.6094725 0.6094725 0.6094725 0.6094725 0.0000000 0.000000
 [9,] 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.7697144 0.7697144 0.7697144 0.7697144 0.000000
[10,] 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.8575440 0.8575440 0.8575440 0.857544

我希望结果是每行中第一个正数的索引,以便我可以通过x[vec_Indexes]回忆这些数字。

有没有办法在没有for循环的情况下做到这一点?

2 个答案:

答案 0 :(得分:2)

如果矩阵仅包含值0和1,我们可以使用max.colties = "first",它将返回行中最高值的索引,如果是tie,则返回第一个索引。

max.col(x, ties.method = "first")
#[1]  1  2  3  4  5  6  7  8  9 10

如果它包含0和1以外的值,我们可以通过将其与0进行比较来创建逻辑矩阵。

x[1, 2]  <- 3
max.col(x > 0, ties.method = "first")
#[1]  1  2  3  4  5  6  7  8  9 10

答案 1 :(得分:0)

另一种方法是使用which(x > 0, arr.ind = TRUE)获取数组索引,然后使用例如{1}获取第一列dplyr

library(dplyr)

data.frame(which(x>0,arr.ind = T)) %>%  group_by(row) %>% slice(which.min(col))

# # A tibble: 10 x 2
# # Groups:   row [10]
# row   col
# <int> <int>
#   1     1     
#   2     2     
#   3     3     
#   4     4     
#   5     5     
#   6     6     
#   7     7     
#   8     8     
#   9     9     
#  10    10