r - 获取与一系列向量一致的矩阵行,而不使用 apply

标签 r matrix vector vectorization apply

我的问题与 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/

相关文章:

r - 为什么min/max/sum(c(NA,4,5),na.rm = "xyz")起作用,而具有相同输入的mean()却不起作用?

c++ - 在着色器上计算标准化设备坐标会显示与在 cpu 上计算不同的结果

Python/Numpy 分割成子矩阵后重新连接矩阵

c++ - c++中 vector 和列表的setter和getter

c++ - 对对象 vector 进行排序

c++ - 要导出的 Base unique_ptr vector

r - openxlsx错误: length of rows and cols must be equal

r - 如何在R中更新软件包?

r - 在 R 中解析嵌套的父子 json

java - java 按升序对矩阵的列进行排序