【问题标题】:Find the first positive number in a matrix找到矩阵中的第一个正数
【发布时间】:2018-04-06 08:21:10
【问题描述】:

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

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

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循环?

【问题讨论】:

  • which(x == 1) 是否满足您的需求?
  • 我需要每行中第一个正数的索引。 which(x ==1) 将返回 40 个索引: [1] 1 11 12 21 22 23 31 32 33 34 42 43 44 45 53 54 55 56 64 65 66 67 75 76 77 78 86 87 88 89 97 98 99 100 108 109 [37] 110 119 120 130
  • 谢谢瓦尔!我更正了这个问题。
  • 试试which(x &gt; 0, arr.ind = TRUE)
  • 我将 Ones 更改为随机数,因为我的数据集有不同的数字。误会请见谅!

标签: r matrix subset


【解决方案1】:

如果矩阵只包含值 0 和 1,我们可以将 max.colties = "first" 一起使用,这将返回行中最高值的索引,如果出现平局,则返回第一个索引。

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

【讨论】:

  • 我可以通过将随机数转换为随机数并获取子集来实际使用它。谢谢!
【解决方案2】:

另一种方法是使用 which(x &gt; 0, arr.ind = TRUE) 获取数组索引,然后使用例如获取第一列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    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多