假设我有一个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),所以上面的代码效率不高。有人可以建议任何更好的代码来进行上述操作吗?
答案 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))}))]