创建矩阵行索引,当rowum> 100时,矩阵行索引增加

时间:2018-08-15 21:34:03

标签: r matrix indexing

我有一个矩阵:

mat <- matrix(c(2,11,3,1,2,4,55,65,12,4,6,6,7,9,3,23,16,77,5,5,7),ncol = 3, byrow = TRUE)

     [,1] [,2] [,3]
[1,]    2   11    3
[2,]    1    2    4
[3,]   55   65   12
[4,]    4    6    6
[5,]    7    9    3
[6,]   23   16   77
[7,]    5    5    7

我想添加一个带有行索引的列。该索引将从1开始并重复相同的索引,直到到达行总和大于100的行以移至下一个值为止。

  Indx[,2][,3][,4]
[1,] 1  2 11  3
[2,] 1  1  2  4
[3,] 2 55 65 12
[4,] 3  4  6  6
[5,] 3  7  9  3
[6,] 4 23 16 77
[7,] 5  5  5  7

4 个答案:

答案 0 :(得分:8)

使用 rle

matRle <- rle(rowSums(mat) > 100)$lengths

cbind(rep(seq(length(matRle)), matRle), mat)
#      [,1] [,2] [,3] [,4]
# [1,]    1    2   11    3
# [2,]    1    1    2    4
# [3,]    2   55   65   12
# [4,]    3    4    6    6
# [5,]    3    7    9    3
# [6,]    4   23   16   77
# [7,]    5    5    5    7

答案 1 :(得分:4)

使用dplyr的解决方案。

library(dplyr)

mat2 <- mat %>%
  as.data.frame() %>%
  mutate(Indx = cumsum(rowSums(dat) > 100 | lag(rowSums(dat) > 100, default = TRUE))) %>%
  select(Indx, paste0("V", 1:ncol(mat))) %>%
  as.matrix()
mat2
#      Indx V1 V2 V3
# [1,]    1  2 11  3
# [2,]    1  1  2  4
# [3,]    2 55 65 12
# [4,]    3  4  6  6
# [5,]    3  7  9  3
# [6,]    4 23 16 77
# [7,]    5  5  5  7

答案 2 :(得分:4)

 cbind(cumsum(replace(a<-rowSums(mat)>100,which(a==1)+1,1))+1,mat)
     [,1] [,2] [,3] [,4]
[1,]    1    2   11    3
[2,]    1    1    2    4
[3,]    2   55   65   12
[4,]    3    4    6    6
[5,]    3    7    9    3
[6,]    4   23   16   77
[7,]    5    5    5    7

这是做什么的??

首先获取大于100的rowSums

a<-rowSums(mat)>100

然后每行的下一行> 100,应具有下一个索引。因此,进行替换和累计:

cumsum(replace(a,which(a==1)+1,1))

现在您将意识到它从零开始,所以您添加1。

答案 3 :(得分:3)

我们可以使用rleid中的data.table

library(data.table)
cbind(Indx =  rleid(rowSums(mat) > 100), mat)
#     Indx         
#[1,]    1  2 11  3
#[2,]    1  1  2  4
#[3,]    2 55 65 12
#[4,]    3  4  6  6
#[5,]    3  7  9  3
#[6,]    4 23 16 77
#[7,]    5  5  5  7