按位置拆分矢量

时间:2014-06-22 01:00:51

标签: r

如果载体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中有快速的方法吗?

4 个答案:

答案 0 :(得分:4)

这是一个包含repsplit的单行:

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])