微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

R 中有没有一种有效的方法可以将矩阵 M2 的每一行“粘贴”到矩阵 M1 的每一行上以获得所有可能的组合?

如何解决R 中有没有一种有效的方法可以将矩阵 M2 的每一行“粘贴”到矩阵 M1 的每一行上以获得所有可能的组合?

假设我有两个矩阵:

M1 <- matrix(letters[1:9],nrow = 3,ncol = 3,byrow = T)
M2 <- matrix(letters[10:18],byrow = T)

实际上,我有 1000 行的更大的矩阵。我想要的是一种无需使用 for 循环即可生成以下内容的有效方法,因为这会导致 R 崩溃。

result <- rbind(cbind(M1,matrix(rep(letters[10:12],3),byrow = T)),cbind(M1,matrix(rep(letters[13:15],matrix(rep(letters[16:18],byrow = T)))

基本上将 M2 的每一行“粘贴”到 M1 的每一行上,以便我拥有所有可能的组合。

解决方法

您可以使用 expand.gridM1M2 中创建所有可能的行索引组合。

mat <- expand.grid(1:nrow(M1),1:nrow(M2))
cbind(M1[mat[[1]],],M2[mat[[2]],])

#     [,1] [,2] [,3] [,4] [,5] [,6]
# [1,] "a"  "b"  "c"  "j"  "k"  "l" 
# [2,] "d"  "e"  "f"  "j"  "k"  "l" 
# [3,] "g"  "h"  "i"  "j"  "k"  "l" 
# [4,] "a"  "b"  "c"  "m"  "n"  "o" 
# [5,] "d"  "e"  "f"  "m"  "n"  "o" 
# [6,] "g"  "h"  "i"  "m"  "n"  "o" 
# [7,] "a"  "b"  "c"  "p"  "q"  "r" 
# [8,] "d"  "e"  "f"  "p"  "q"  "r" 
# [9,] "g"  "h"  "i"  "p"  "q"  "r" 
,

您可以尝试比 RcppAlgos::permuteGeneral 快得多的 expand.grid

FUN <- function(M1,M2) {
  stopifnot(all.equal(dim(M1),dim(M2)))
  p <- RcppAlgos::permuteGeneral(seq.int(dim(M1)[1]),2,repetition=T)
  cbind(M1[p[,2],M2[p[,1],])
}
FUN(M1,M2)
#     [,] "g"  "h"  "i"  "p"  "q"  "r" 

基准

# Unit: microseconds
#        expr     min       lq      mean   median      uq       max neval cld
# expand.grid 147.724 151.4235 628.38420 154.8680 157.291 46840.374   100   a
#   RcppAlgos  74.500  77.4340  84.75624  80.1125  82.409   238.807   100   a

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。