如果载体x
带有
length(x)
# 100
还有一个向量a
,它表示x的子向量的前导索引:
a
# 1, 5, 23, 79
然后我想根据x
分割a
,如下所示:
list(x[1:4], x[5:22], x[23:78], x[79:100])
在R中有快速的方法吗?
答案 0 :(得分:4)
这是一个包含rep
和split
的单行:
split(x, rep(seq(a), diff(c(a, length(x)+1))))
seq(a)
返回数字1到4,rep
根据a
(使用diff
函数提取)重复适当的次数。最后,split
使用作为第二个参数传递的类别分解作为第一个参数传递的对象。
答案 1 :(得分:3)
之前的答案都依赖于制作与原始x
向量长度相同的分割列表/向量。在非常长的向量的情况下,这可能是低效的,可以避免:
Map(function(i,j) x[i:j], a, cumsum(diff(c(a, length(x)+1))))
答案 2 :(得分:2)
lapply(seq(a),function(i) x[a[i]:c(a[-1]-1,length(x))[i]])
代码说明:
seq(a) #returns a index vector of length 4
as.list(seq(a))
或
lapply(seq(a),function(i) i) #returns a list with the index elements (1:4)
lapply(seq(a),function(i) a[i])#returns the list with corresponding values of `a`
lapply(seq(a),function(i) c(a[-1]-1, length(x))[i]) #returns list with end points
加入以上两行代码:
lapply(seq(a),function(i) a[i]:c(a[-1]-1, length(x))[i]) # sequence of start:end points
lapply(seq(a),function(i) x[a[i]:c(a[-1]-1, length(x))[i]]) #returns the values of x between start:end index
答案 3 :(得分:1)
构造索引向量列表,然后lapply()
:
vec <- mapply(seq,a,length=diff(c(a,101)))
lapply(vec,function(v) x[v])