我的目标是将多个元素插入到不同位置的向量中。这是一个例子,然后进行了许多不起作用的试验。
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
有没有办法在每个特定位置一次插入一个元素?我已经看到几个问题解决了单个元素的追加基本问题,其中一个位置或两个元素被添加到同一位置,但是没有多个元素被添加到向量中的多个位置。
答案 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