我有一个长向量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
的长度。
答案 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)
如果您的n
为10
,您将收到一行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]