wol*_*oor 3 r vector matrix vectorization apply
我的问题与我之前的问题有关.
假设我有一个矩阵和4个向量(可以考虑另一个矩阵,因为向量的顺序很重要),我想按顺序得到与每个向量重合的行号.我希望解决方案避免重复向量并尽可能高效,因为问题是大规模的.
例.
set.seed(1)
M = matrix(rpois(50,5),5,10)
v1 = c(3, 2, 7, 7, 4, 4, 7, 4, 5, 6)
v2= c(8, 6, 4, 4, 3, 8, 3, 6, 5, 6)
v3= c(4, 8, 3, 5, 9, 4, 5, 6, 7 ,7)
v4= c(4, 9, 3, 6, 3, 1, 5, 7,6, 1)
Vmat = cbind(v1,v2,v3,v4)
M
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 4 8 3 5 9 4 5 6 7 7
[2,] 4 9 3 6 3 1 5 7 6 1
[3,] 5 6 6 11 6 4 5 2 7 5
[4,] 8 6 4 4 3 8 3 6 5 6
[5,] 3 2 7 7 4 4 7 4 5 6
Vmat
v1 v2 v3 v4
[1,] 3 8 4 4
[2,] 2 6 8 9
[3,] 7 4 3 3
[4,] 7 4 5 6
[5,] 4 3 9 3
[6,] 4 8 4 1
[7,] 7 3 5 5
[8,] 4 6 6 7
[9,] 5 5 7 6
[10,] 6 6 7 1
Run Code Online (Sandbox Code Playgroud)
输出应该是......
5 4 1 2
Run Code Online (Sandbox Code Playgroud)
我认为在@bunk之后将每个向量折叠为单个值是要走的路:
m = do.call(function(...) paste(...,sep="_"), split(M, col(M)))
v = sapply(list(v1,v2,v3,v4), paste0, collapse="_")
match(v,m)
# [1] 5 4 1 2
Run Code Online (Sandbox Code Playgroud)
更自然的建筑方式m将使用apply,但这是禁止的.如果您存储M为data.frame,则另一个选项是:
m = do.call(function(...) paste(...,sep="_"), as.data.frame(M))
Run Code Online (Sandbox Code Playgroud)