#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. Извините, должно быть, вставил не те строки. Исправили.