如何将元素插入向量?

时间:2009-09-29 17:35:31

标签: r

我有一个逻辑向量,我希望在特定索引处插入新元素。我在下面提出了一个笨拙的解决方案,但有更简洁的方法吗?

probes <- rep(TRUE, 15)
ind <- c(5, 10)
probes.2 <- logical(length(probes)+length(ind))
probes.ind <- ind + 1:length(ind)
probes.original <- (1:length(probes.2))[-probes.ind]
probes.2[probes.ind] <- FALSE
probes.2[probes.original] <- probes

print(probes)

给出

[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

print(probes.2)

给出

[1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
[13]  TRUE  TRUE  TRUE  TRUE  TRUE

所以它有效,但看起来很难看 - 有什么建议吗?

8 个答案:

答案 0 :(得分:64)

这些都是非常有创意的方法。我认为使用索引绝对是可行的方法(Marek的解决方案非常好)。

我只想提一下,有一个功能大致可以做到:append()

probes <- rep(TRUE, 15)
probes <- append(probes, FALSE, after=5)
probes <- append(probes, FALSE, after=11)

或者您可以使用索引递归执行此操作(需要在每次迭代时增加“after”值):

probes <- rep(TRUE, 15)
ind <- c(5, 10)
for(i in 0:(length(ind)-1)) 
    probes <- append(probes, FALSE, after=(ind[i+1]+i))

顺便提一下,this question was also previously asked on R-Help。正如巴里所说:

“实际上我会说没有办法做到这一点,因为我不认为你实际上可以插入一个向量 - 你必须创建一个产生插入错觉的新向量!”

答案 1 :(得分:32)

你可以用索引做一些魔术:

首先使用输出值创建向量:

probs <- rep(TRUE, 15)
ind <- c(5, 10)
val <- c( probs, rep(FALSE,length(ind)) )
# > val
#  [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
# [13]  TRUE  TRUE  TRUE FALSE FALSE

现在骗局。每个旧元素获得排名,每个新元素获得半等级

id  <- c( seq_along(probs), ind+0.5 )
# > id
#  [1]  1.0  2.0  3.0  4.0  5.0  6.0  7.0  8.0  9.0 10.0 11.0 12.0 13.0 14.0 15.0
# [16]  5.5 10.5

然后使用order按正确顺序排序:

val[order(id)]
#  [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
# [13]  TRUE  TRUE  TRUE  TRUE  TRUE

答案 2 :(得分:8)

这个怎么样:

> probes <- rep(TRUE, 15)
> ind <- c(5, 10)

> probes.ind <- rep(NA, length(probes))
> probes.ind[ind] <- FALSE
> new.probes <- as.vector(rbind(probes, probes.ind))
> new.probes <- new.probes[!is.na(new.probes)]
> new.probes
 [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
[13]  TRUE  TRUE  TRUE  TRUE  TRUE

答案 3 :(得分:8)

probes <- rep(TRUE, 1000000)
ind <- c(50:100)
val <- rep(FALSE,length(ind))

new.probes <- vector(mode="logical",length(probes)+length(val))
new.probes[-ind] <- probes
new.probes[ind] <- val

一些时间: 我的方法    用户系统已过    0.03 0.00 0.03

马雷克方法    用户系统已过    0.18 0.00 0.18

R附加for循环    用户系统已过    1.61 0.48 2.10

答案 4 :(得分:2)

这有点棘手。这是一种方式。它遍历列表,每次插入,因此效率不高。

probes <- rep(TRUE, 15)
probes.ind <- ind + 0:(length(ind)-1)
for (i in probes.ind) {
  probes <- c(probes[1:i], FALSE, probes[(i+1):length(probes)])
}

> probes
 [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
[13]  TRUE  TRUE  TRUE  TRUE  TRUE

如果ind有重复的元素,这甚至可以工作,虽然ind确实需要为probe.ind构造进行排序才能工作。

答案 5 :(得分:1)

或者你可以使用miscTools包中的insertRow函数来完成它。

probes <- rep(TRUE, 15)
ind <- c(5,10)
for (i in ind){
    probes <- as.vector(insertRow(as.matrix(probes), i, FALSE))
}

答案 6 :(得分:0)

我想出了一个很好的答案,该答案易于理解并且运行起来非常快,是在上述Wojciech的答案基础上构建的。我将在此处的示例中采用该方法,但是对于缺少点的任意模式(如下所示),它可以很容易地推广到几乎所有数据类型。

probes <- rep(TRUE, 15)
ind <- c(5,10)

probes.final <- rep(FALSE, length(probes)+length(ind))
probes.final[-ind] <- probes

我需要的数据是按固定的时间间隔采样的,但是抛出了很多采样,并且生成的数据文件仅包含那些保留的时间戳和度量。我需要产生一个包含所有时间戳的向量和一个数据向量,其中插入了要插入的时间戳的NA。我使用了从here窃取的“ not in”函数,使其变得更简单。

`%notin%` <- Negate(`%in%`)
dat <- rnorm(50000) # Data given
times <- seq(from=554.3, by=0.1, length.out=70000] # "Original" time stamps
times <- times[-sample(2:69999, 20000)] # "Given" times with arbitrary points missing from interior

times.final <- seq(from=times[1], to=times[length(times)], by=0.1)
na.ind <- which(times.final %notin% times)
dat.final <- rep(NA, length(times.final))
dat.final[-na.ind] <- dat

答案 7 :(得分:0)

嗯,你好,我也有同样的疑问,但是我无法理解人们的回答,因为我仍在学习语言。因此,我尝试制作自己的作品,并且我想它可行!我创建了一个向量,我想在第3、5和6个索引之后插入值100。这就是我写的。

vector <-  c(0:9)
indexes <-  c(6, 3, 5)
indexes <- indexes[order(indexes)]
i <-  1
j <-  0

while(i <= length(indexes)){
  vector <- append(vector, 100, after = indexes[i] + j)
  i <-i + 1
  j <- j + 1
}
vector

向量“索引”必须按升序才能起作用。这就是为什么我将它们排列在第三行的原因。 变量“ j”是必需的,因为在每次迭代中,新向量的长度都会增加,并且原始值会移动。 如果您希望将新值彼此相邻插入,只需重复索引号即可。例如,通过分配索引<-c(3,5,5,5,6),您应该获得vector == 0 1 2 100 3 4 100 100 100 5 100 6 7 8 9