在向量中的不同位置添加一系列元素

时间:2016-03-19 18:45:26

标签: r

我的目标是将多个元素插入到不同位置的向量中。这是一个例子,然后进行了许多不起作用的试验。

w  <- c( 1,3,2,4,2,3,2,4,5,7,9,3,2,4,2,5,7,4,2 )
u  <- c( 3,7,9,12 )
o  <- c( 10 , 20 , 30 , 40 )

我试过了:

append ( w , o , after = u )  

# which adds the series one time in the first location of after 

fun <- function (x) append ( w , o[[x]] , after = u[[x]] )
lapply ( seq ( length ( u )) , fun )

# which adds one element to the list each time for a new vector producing a  number of vectors 

for (i in length(o)) {
append ( w , o[[i]] , after = u[[i]] )
}
# which basically does nothing

期望输出

1,3,2,10,4,2,3,2,20,4,5,30,7,9,3,40,2,4,2,5,7,4,2

有没有办法在每个特定位置一次插入一个元素?我已经看到几个问题解决了单个元素的追加基本问题,其中一个位置或两个元素被添加到同一位置,但是没有多个元素被添加到向量中的多个位置。

4 个答案:

答案 0 :(得分:4)

这是另一种执行此操作的矢量化方法

New <- rep(w, (1:2)[(1:length(w) %in% u) + 1])
New[u + 1:length(u)] <- o
New
# [1]  1  3  2 10  4  2  3  2 20  4  5 30  7  9  3 40  2  4  2  5  7  4  2

这基本上适用于子集矢量技术,通过提取u两次的值并使用o

中的值重新分配它们

答案 1 :(得分:4)

x <- numeric(length(w)+length(o))
ind <- u + order(u) #index to insert o vector (which I shamelessly borrowed from Josilber's answer)
x[ind] <- o
x[-ind] <- w
x
# [1]  1  3  2 10  4  2  3  2 20  4  5 30  7  9  3 40  2  4  2  5  7  4  2

答案 2 :(得分:3)

你可以通过计算每个新元素和旧元素的位置并一次性添加它们,以矢量化的方式(也就是不重复append ing)来做到这一点:

# Positions of old and new elements
add.pos <- u + order(u)
old.pos <- seq_len(length(w) + length(u))
old.pos <- old.pos[!old.pos %in% add.pos]

# Construct new vector in one shot
new.vec <- rep(NA, length(old.pos))
new.vec[add.pos] <- o
new.vec[old.pos] <- w
new.vec
# [1]  1  3  2 10  4  2  3  2 20  4  5 30  7  9  3 40  2  4  2  5  7  4  2

由于这不涉及每次添加元素时反复重新分配向量的空间,如果添加了大量元素,它应该更快。

答案 3 :(得分:1)

idx <- sort(c(1:length(w), u))
replace(w[idx], c(FALSE, diff(idx) == 0), o)
# [1]  1  3  2 10  4  2  3  2 20  4  5 30  7  9  3 40  2  4  2  5  7  4  2