Как вставить элементы в вектор?

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

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 

Так оно работает, но уродливо выглядит – любые предложения?

Вы можете сделать магию с индексами:

Сначала создайте вектор с выходными значениями:

 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 

Все это очень творческие подходы. Я думаю, что работа с индексами – это определенно путь (решение Марека очень приятно).

Я бы просто упомянул, что есть функция сделать примерно то: append() .

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

Или вы можете сделать это рекурсивно с вашими индексами (вам нужно увеличить значение «после» на каждой итерации):

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

Кстати, этот вопрос также был задан ранее в R-Help . Как говорит Барри:

«На самом деле я бы сказал, что не было никаких способов сделать это, так как я не думаю, что вы действительно можете вставить в вектор - вам нужно создать новый вектор, создающий иллюзию вставки!»

Как насчет этого:

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

Пользовательская система метода Marek прошла 0.18 0.00 0.18

R добавлено для пользователя, использующего пользовательскую систему цикла 1.61 0.48 2.10

Это довольно сложно. Вот один из способов. Он перебирает список, вставляя каждый раз, поэтому он не слишком эффективен.

 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 нужно сортировать для работы конструкции probes.ind.

Или вы можете сделать это, используя функцию insertRow из пакета miscTools.

 probes <- rep(TRUE, 15) ind <- c(5,10) for (i in ind){ probes <- as.vector(insertRow(as.matrix(probes), i, FALSE)) } 
  • R: преобразовать строку с разделителями в переменные
  • Добавить переменную в кадр данных, содержащий максимальное значение каждой строки
  • Извлечение элементов, общих во всех группах столбцов
  • Разница между `% in%` и `==`
  • Создание вектора, разделенного запятыми
  • Градиент из n цветов, начиная от цвета 1 и цвета 2
  • Эффективно конвертировать обратную косую черту в косую черту в R
  • Есть ли способ сделать R звуковой сигнал / воспроизвести звук в конце скрипта?
  • backtransform `scale ()` для построения графика
  • Ошибка в model.frame.default ... переменная длина отличается
  • Как найти разницу в стоимости в каждых двух последовательных строках в R?
  • Давайте будем гением компьютера.