使用R在矢量的不同位置处排除相同大小的块

时间:2015-07-07 05:08:01

标签: r

假设我有一个1000的长矢量。

x=rnorm(1000,10,1)

还有另一个载体,

y<-c(1,7,10,16,29,50)

我想要一个从&#34; x&#34;获得的向量,在向量y指示的位置排除长度为4的块。

例如,在删除第(1-4)个组件,(7-10)组件,(16-19)组件之后,我希望有一个来自&#34; x&#34;的向量,( 29-32)&#34; x&#34;和(50-53)的组成部分。

我正在使用list

x1=list()
for (k in 1:(length(y)-1))
{
  x1[[k]]=x[-(y[k]:(y[k]+3)),]          
}
x2=as.data.frame(x1)  

我正在考虑很长的向量(dim = 100k),所以上面的代码效率不高。有人可以建议任何更好的代码来进行上述操作吗?

4 个答案:

答案 0 :(得分:5)

创建一组要删除的值,只创建一次子集:

x[-unlist(lapply(y, function(n) seq.int(n,n+3) ))]

或者甚至是下面的,可能会慢一点,但会节省几个字符的输入:

x[-c(sapply(y, function(n) seq.int(n,n+3) ))]

答案 1 :(得分:3)

这应该是合理有效的。它将向量0:3添加到y中的每个项目,并删除索引值:

x[ - outer(y, 0:3, "+") ]

基准测试已接近但我认为我的版本在编码经济方面获胜:

>  x <- rnorm(1e7)
> y=sample(1e7, 1e5)
> system.time( replicate(10, {z<- x[-outer(y, 0:3, "+")]}  ) )
   user  system elapsed 
  6.519   1.629   8.126 
> system.time( replicate(10, {z<- x[-unlist(lapply(y, function(n) seq.int(n,n+3) ))]}))
   user  system elapsed 
  7.959   1.041   8.970 

这可能会更快(而且它是outer使用的):

system.time( replicate(10, {z<- x[-( rep(y, times=4) +rep(0:3, each=length(y) ) )]}))
   user  system elapsed 
  5.493   1.754   7.208 

但罗宾逊是正确的,不需要第一次rep()调用。

答案 2 :(得分:3)

您可以使用datepicker执行此操作,因为通过向量添加循环:

rep

根据我的基准测试,这是最快的解决方案大约7倍:

x[-(y + rep(0:3, each = length(y)))]

答案 3 :(得分:1)

看起来thelatemail打败了我

x[-unlist(lapply(y,function(x){return(seq(x,x+3))}))]