2016-03-19 3 views
4

Я стараюсь вставлять несколько элементов в вектор каждый в разных местах. Это пример, за которым следует ряд испытаний, которые не работают.Добавить ряд элементов в разных местах в пределах вектора

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 

Есть ли способ, чтобы вставить каждый элемент по одному в каждом конкретном месте? Я видел несколько вопросов, касающихся базового элемента append для одного элемента с одним местоположением или двумя элементами, которые должны быть добавлены в ту же позицию, но не для добавления нескольких элементов в несколько местоположений в векторе.

+0

Просто было принято решение, так как я забыл осветить цикл в вопросе имени. Однако векторизация должна быть быстрее в соответствии с множеством решений. – Barnaby

ответ

3

Вы могли бы сделать это в векторизованного образом (иначе не раз append ИНГ) путем вычисления положения каждого нового элемента и старого элемента и добавление их в одном кадре:

# 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 

Поскольку это не связано с многократно перераспределяя пространство для вектора каждый раз, когда вы добавляете элемент, он должен быть быстрее, если у вас есть большое количество добавляемых элементов.

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
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 
+0

Вы не любите много писать, кроме кода, не так ли? –

+0

@DavidArenburg, зависит от вопроса и моего ответа – Julius

+0

Не сам парень кода, как вы можете видеть из простых вопросов. Как ответы, как это сделать более эффективным способом, чем цикл. позвольте мне спросить вас, одобрите ли вы вопрос, как задать вопрос выше, чем цикл. – Barnaby

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 
Смежные вопросы