我有一个大矩阵
# 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之前的常用数字是15。
答案 0 :(得分: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
意思是,第一行没有7,第二行在第一列有一个,依此类推。从那里,您可以遍历列表以识别所需的“邻居”。此外,在循环之前,应删除任何列值,这将使您的下标超出范围错误。例如,
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])
}
}