首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在r中创建另一个向量的附加子集

在r中创建另一个向量的附加子集
EN

Stack Overflow用户
提问于 2018-04-11 01:30:15
回答 2查看 86关注 0票数 0

我有一个向量:

代码语言:javascript
复制
c(1,2,3,4,5,6,7,8,9,10)

我想要创建一个向量:

代码语言:javascript
复制
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只是索引)

做这件事最好的方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-11 01:37:26

几种方法

矩阵

代码语言:javascript
复制
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

如果数字不是连续的,这也应该有效。

代码语言:javascript
复制
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 12

Rcpp

构造矩阵可能很慢,所以下面是一种使用Rcpp的方法

代码语言:javascript
复制
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

基准测试

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2018-04-11 01:34:39

编辑

如果向量不是连续的,那么我们可以:

代码语言:javascript
复制
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

它也适用于连续向量。

代码语言:javascript
复制
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

原始答案

应该有一件简单的事情,但现在我能想到的是:

代码语言:javascript
复制
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

数据

代码语言:javascript
复制
x <- c(1,2,3,4,5,6,7,8,9,10)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49765088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档