我的问题与 my earlier question 有关.
假设我有一个矩阵和 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
输出应该是……
5 4 1 2
最佳答案
我认为按照@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
构建m
的更自然的方法是使用apply
,但这是禁止使用的。如果您将 M
存储为 data.frame,另一种选择是:
m = do.call(function(...) paste(...,sep="_"), as.data.frame(M))
关于r - 获取与一系列向量一致的矩阵行,而不使用 apply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32654938/