gpt4 book ai didi

r - 在 R 中按组有效地复制矩阵行

转载 作者:行者123 更新时间:2023-12-04 15:56:52 25 4
gpt4 key购买 nike

我正在尝试找到一种方法来根据组有效地复制 R 中的矩阵行。假设我有以下矩阵 a:

a <- matrix(
c(1, 2, 3,
4, 5, 6,
7, 8, 9),
ncol = 3, byrow = TRUE
)

我想创建一个新矩阵,其中 a 中的每一行根据向量中指定的数字(我称之为“组”)重复,例如:

reps <- c(2, 3, 4)

在这种情况下,生成的矩阵将是:

     [,1] [,2] [,3]
[1,] 1 2 3
[2,] 1 2 3
[3,] 4 5 6
[4,] 4 5 6
[5,] 4 5 6
[6,] 7 8 9
[7,] 7 8 9
[8,] 7 8 9
[9,] 7 8 9

这是迄今为止我想出的唯一解决方案:

matrix(
rep(a, times = rep(reps, times = 3)),
ncol = 3, byrow = FALSE
)

请注意,在此解决方案中,我必须使用 rep() 两次 - 首先复制 reps 向量,然后再次实际复制 的每一行一个

此解决方案工作正常,但我正在寻找更有效的解决方案,因为在我的情况下,这是在优化循环中完成的,并且在循环的每次迭代中都被计算,如果 a 很大。

我会注意到 this question非常相似,但它是关于重复每一行相同的次数。 This question同样是关于效率,但它是关于复制整个矩阵。

更新

由于我对效率感兴趣,这里是迄今为止提供的解决方案的简单比较......随着更多的进来,我会更新这个,但总的来说它看起来像 seq_along解决方案 F. Privé是最快的。

library(dplyr)
library(tidyr)

a <- matrix(seq(9), ncol = 3, byrow = TRUE)
reps <- c(2, 3, 4)

rbenchmark::benchmark(
"original solution" = {
result <- matrix(rep(a, times = rep(reps, times = 3)),
ncol = 3, byrow = FALSE)
},
"seq_along" = {
result <- a[rep(seq_along(reps), reps), ]
},
"uncount" = {
result <- as.data.frame(a) %>%
uncount(reps)
},
replications = 1000,
columns = c("test", "replications", "elapsed", "relative")
)
               test replications elapsed relative
1 original solution 1000 0.004 1.333
2 seq_along 1000 0.003 1.000
3 uncount 1000 1.722 574.000

最佳答案

只需使用 a[rep(seq_along(reps), reps), ]

关于r - 在 R 中按组有效地复制矩阵行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68604898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com