矩阵R中的序列模式

问题描述 投票:-1回答:1

我有一个大矩阵

#  id    v1   v2   v3   v4   v5   v6   v7   v8
# 1001   37   15   30   37    4   11   35   37
# 2111   44   31   44   30   24   39   44   18
# 3121   43   49   39   34   44   43   26   24
# 4532   45   31   26   33   12   47   37   15
# 5234   23   27   34   23   30   34   23    4
# 6345   9    46   39   34    8   43   26   24

我想识别以相同数字开头和结尾的序列。 以下序列示例:

输出:

1001 [v1] to [v4] 37 to 37: 15,30
1001 [v4] to [v8] 37 to 37: 4, 11, 35
2111 [v1] to [v3] 44 to 44: 31 
2111 [v3] to [v7] 44 to 44: 30, 24, 39

我想知道37后面的数字37,在这种情况下37之前的常用数字是15。

r matrix sequence
1个回答
0
投票

如果您希望跨矩阵的行执行此操作,则可以使用apply以及哪个用于标识每行中的数字等于您想要的数字(在示例中为43)。代码如下:

equal.43 = apply(mat==43,1,which)

这将为您提供一个列表,其中列表中的每个元素对应于矩阵的每一行,并且在这些元素内部,您将具有包含该值的列号。例如,假设你的矩阵如下:

     [,1] [,2] [,3] [,4]
[1,]    3    5   10   10
[2,]    7    5    6   10
[3,]   10    7    5    5
[4,]    6    8   10    9
[5,]    2    5    7   10

然后运行命令:

where.is.7 = apply(x==7,1,which)

如果你检查where.is.7,你会看到:

[[1]]
integer(0)

[[2]]
[1] 1

[[3]]
[1] 2

[[4]]
integer(0)

[[5]]
[1] 3

意思是,第1行没有7,第2行在第1列有一个,依此类推。从那里你可以遍历列表来识别你想要的任何“邻居”。此外,在循环之前,您应该删除任何列值,这将为您提供下标超出范围的错误。例如,

where.is.7 = lapply(where.is.7,function(x) x[x<4])
followers = c()
for(i in 1:5){

  if(length(where.is.7[[i]])>0){
    followers = cbind(followers,x[i,where.is.7[[i]]+1])
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.