Объединить определенные элементы в списке в r

#r

Вопрос:

Я создал такой список:

 l<-list(">1","ATTCGGT","GCCCTCGT",">2","GGGAATCCT",">3","CCCAATTGG","TTGGCCCTA")
 

Я хочу объединить все элементы, кроме тех, которые содержат»>».
Например, мой вывод должен выглядеть так:

 l
[[1]]
[1] ">1"
[[2]]
[1] "ATTCGGTGCCCTCGT
[[3]]
[1]">2"
[[4]]
[1]"GGGAATCCT"
[[5]]
[1]">3"
[[6]]
[1]"CCCAATTGGTTGGCCCTA"
 

Я могу объединить 2 элемента списка с помощью paste0, но мне нужно сделать это по отдельности, а затем удалить второй элемент из списка вручную. Как я могу заставить R автоматически объединить все элементы, кроме тех, которые содержат»>», и предоставить мне список, который я хочу?

Ответ №1:

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

Обратите внимание, что, поскольку каждый элемент входного списка l имеет только один компонент, было бы проще использовать векторы символов, а не списки, и в этом случае ul был бы входным, и мы могли бы опустить аргумент simplify для tapply.

 ul <- unlist(l)
ok <- grepl(">", ul)     # TRUE FALSE FALSE TRUE FALSE TRUE FALSE FALSE
g <- 2*cumsum(ok) - ok   # 1 2 2 3 4 5 6 6
unname(tapply(ul, g, paste, collapse = "", simplify = FALSE))
 

дающий:

 [[1]]
[1] ">1"

[[2]]
[1] "ATTCGGTGCCCTCGT"

[[3]]
[1] ">2"

[[4]]
[1] "GGGAATCCT"

[[5]]
[1] ">3"

[[6]]
[1] "CCCAATTGGTTGGCCCTA"
 

Комментарии:

1. Когда я запускаю вторую строку вашего кода, R говорит, что объект «ок» не найден. Есть ли пакет, который я должен добавить?

2. Извините, должно быть, вставил не те строки. Исправили.