我试图在矩阵的每一行中找到第一个正数或非零数。
这里我尝试复制我的数据集:
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循环的情况下做到这一点?
答案 0 :(得分:2)
如果矩阵仅包含值0和1,我们可以使用max.col
和ties = "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