如何解决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.grid
在 M1
和 M2
中创建所有可能的行索引组合。
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 举报,一经查实,本站将立刻删除。