Я думаю, что здесь можно использовать кодирование длин серий.
(Кстати: мне не нравится использовать list
в качестве имени переменной, поскольку это такая часто используемая функция R. Хотя R знает, хорошо, что вы имеете в виду, когда ссылаетесь, вполне возможно, что это можно обмануть, и устранение неполадок будет проблематичным c. Поэтому я назвал это mylist
здесь.)
mylist <- c("TI - a", "AU - b", "ER -", " ",
"TI - c", "AU - d", "ER -", " ",
"TI - e", "AU - f", "ER -")
non_ER_runs <- rle(mylist == "ER -")
non_ER_runs
# Run Length Encoding
# lengths: int [1:6] 2 1 3 1 3 1
# values : logi [1:6] FALSE TRUE FALSE TRUE FALSE TRUE
RLE говорит нам сколько в каждой категории. Для нас категория «соответствует и не соответствует». Вектор $values
здесь говорит нам, что первые элементы не не совпадают (FALSE
), и их два. Вторая партия соответствует (TRUE
) и имеет длину 1. Et c.
inds <- cumsum(non_ER_runs$lengths)
newlist <- mapply(function(a,b) mylist[a:b], c(1, 1+head(inds, n=-1)), inds)
newlist
# [[1]]
# [1] "TI - a" "AU - b"
# [[2]]
# [1] "ER -"
# [[3]]
# [1] " " "TI - c" "AU - d"
# [[4]]
# [1] "ER -"
# [[5]]
# [1] " " "TI - e" "AU - f"
# [[6]]
# [1] "ER -"
Итак, мы разбили каждую партию на собственный вектор. Используя возврат из rle
снова, мы можем выбрать только те элементы, к которым мы хотим что-то добавить:
newlist[ non_ER_runs$values ]
# [[1]]
# [1] "ER -"
# [[2]]
# [1] "ER -"
# [[3]]
# [1] "ER -"
Map(function(vec, vec2) c(vec, vec2),
newlist[ non_ER_runs$values ],
sprintf("ID - %i", seq_along(newlist[ non_ER_runs$values ])))
# [[1]]
# [1] "ER -" "ID - 1"
# [[2]]
# [1] "ER -" "ID - 2"
# [[3]]
# [1] "ER -" "ID - 3"
Теперь нужно просто заменить элементы списка новыми элементами, а затем unlist
newlist[ non_ER_runs$values ] <-
Map(function(vec, vec2) c(vec, vec2),
newlist[ non_ER_runs$values ],
sprintf("ID - %i", seq_along(newlist[ non_ER_runs$values ])))
newlist <- unlist(newlist)
newlist
# [1] "TI - a" "AU - b" "ER -" "ID - 1" " "
# [6] "TI - c" "AU - d" "ER -" "ID - 2" " "
# [11] "TI - e" "AU - f" "ER -" "ID - 3"