我有一个向量:
c(1,2,3,4,5,6,7,8,9,10)我想要创建一个向量:
c(1,2,3,4,5,6,7,8,9,10,2,3,4,5,6,7,8,9,10,3,4,5,6,7,8,9,10,...,8,9,10,9,10)初始向量的长度是一个较大的数。
如果向量内的数字不是1到10呢?它们是随机的。(1.10只是索引)
做这件事最好的方法是什么?
发布于 2018-04-11 01:37:26
几种方法
矩阵
x <- c(1,2,3,4,5,6,7,8,9,10)
m <- matrix(x, ncol = length(x), nrow = length(x))
c(x, m[lower.tri(m)])
# [1] 1 2 3 4 5 6 7 8 9 10 2 3 4 5 6 7 8 9 10 3 4 5 6 7 8 9 10 4 5 6 7 8 9 10 5 6 7 8 9 10 6 7 8 9
# [45] 10 7 8 9 10 8 9 10 9 10 10如果数字不是连续的,这也应该有效。
x <- c(1, 3, 9, 12)
m <- matrix(x, ncol = length(x), nrow = length(x))
c(x, m[lower.tri(m)])
# [1] 1 3 9 12 3 9 12 9 12 12Rcpp
构造矩阵可能很慢,所以下面是一种使用Rcpp的方法
library(Rcpp)
cppFunction('Rcpp::NumericVector expandVec(Rcpp::NumericVector x) {
Rcpp::IntegerVector len = seq(1, x.size());
int n = std::accumulate(len.begin(), len.end(), 0.0);
Rcpp::NumericVector res(n);
int counter = 0;
for (int i = 0; i < x.size(); i++) {
for (int j = i; j < x.size(); j++) {
res[counter] = x[j];
counter++;
}
}
return res;
}')
expandVec(x)
# [1] 1 3 9 12 3 9 12 9 12 12基准测试
x <- 1:10000
library(microbenchmark)
microbenchmark(
mat = {
m <- matrix(x, ncol = length(x), nrow = length(x))
c(x, m[lower.tri(m)])
},
sap = {
unlist(sapply(seq_along(x), function(i) x[i:length(x)]))
},
rcpp = {
expandVec(x)
},
times = 5
)
# Unit: milliseconds
# expr min lq mean median uq max neval
# mat 4162.9725 4203.3983 4244.7126 4236.7377 4301.8310 4318.6233 5
# sap 571.1738 605.8128 621.1055 625.9673 642.3775 660.1963 5
# rcpp 317.2585 331.1198 355.9293 335.0221 383.9853 412.2611 5发布于 2018-04-11 01:34:39
编辑
如果向量不是连续的,那么我们可以:
x <- c(1, 3, 9, 12)
unlist(sapply(seq_along(x), function(i) x[i:length(x)]))
#[1] 1 3 9 12 3 9 12 9 12 12它也适用于连续向量。
x <- c(1,2,3,4,5,6,7,8,9,10)
unlist(sapply(seq_along(x), function(i) x[i:length(x)]))
#[1] 1 2 3 4 5 6 7 8 9 10 2 3 4 5 6 7 8 9 10 3 4 5 6 7 8
#[26] 9 10 4 5 6 7 8 9 10 5 6 7 8 9 10 6 7 8 9 10 7 8 9 10 8
#[51] 9 10 9 10 10原始答案
应该有一件简单的事情,但现在我能想到的是:
unlist(sapply(x, function(i) seq(i, max(x))))
#[1] 1 2 3 4 5 6 7 8 9 10 2 3 4 5 6 7 8 9 10 3 4 5 6 7 8
#[26] 9 10 4 5 6 7 8 9 10 5 6 7 8 9 10 6 7 8 9 10 7 8 9 10 8
#[51] 9 10 9 10 10在这里,我们循环遍历x中的每个元素,并从该元素创建一个序列,直到向量中的max。
数据
x <- c(1,2,3,4,5,6,7,8,9,10)https://stackoverflow.com/questions/49765088
复制相似问题