从矢量选择

时间:2014-02-20 16:37:24

标签: r vector

我有一个长向量data。以及一个小向量v,表示与data向量相关的一组索引。现在我想做出以下选择:

data[v[1]:(v[1]+10)], data[v[2]:(v[2]+10)], ..., data[v[n]:(v[n]+10)]

产生10-by-length(v)矩阵。

我的解决方案是:

d1 <- data[ v[1]:(v[1]+10)]
d2 <- data[ v[2]:(v[2]+10)]
d3 <- data[ v[3]:(v[3]+10)]
d4 <- data[ v[4]:(v[4]+10)]
d5 <- data[ v[5]:(v[5]+10)]
d6 <- data[ v[6]:(v[6]+10)]
d7 <- data[ v[7]:(v[7]+10)]
d8 <- data[ v[8]:(v[8]+10)]
d9 <- data[ v[9]:(v[9]+10)]
d0 <- data[v[10]:(v[10]+10)]
md <- matrix(c(d1,d2,d3,d4,d6,d7,d8,d9,d0),length(d1))

做这项工作的R风格会是什么?

因此,代码不再取决于v的长度。

3 个答案:

答案 0 :(得分:4)

如果我理解你的问题,也许这样的事情会有所帮助:

m <- 1:20   ## Your "long" vector
v <- 1:5    ## Your "short" vector

## m[1:(1+5)], m[2:(2+5)], ... etc
sapply(v, function(x) m[x:(x+5)])
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    2    3    4    5    6
[3,]    3    4    5    6    7
[4,]    4    5    6    7    8
[5,]    5    6    7    8    9
[6,]    6    7    8    9   10

答案 1 :(得分:2)

如果您的n10,您将收到一行11行。也许你想要长度为10的索引:

> data <- 1:20
> v <- c(3, 5, 7)
> n <- 10
> matrix(data[mapply(seq, v, v + n - 1)], n)
      [,1] [,2] [,3]
 [1,]    3    5    7
 [2,]    4    6    8
 [3,]    5    7    9
 [4,]    6    8   10
 [5,]    7    9   11
 [6,]    8   10   12
 [7,]    9   11   13
 [8,]   10   12   14
 [9,]   11   13   15
[10,]   12   14   16

答案 2 :(得分:0)

这是embed的另一种方式。

data <- 1:20
v <- c(3,5,7)
n <- 10
embed(data, max(v))[1:n,max(v)-v+1]