Применение поэлементной функции к вектору или списку не удастся с помощью sapply или lapply - PullRequest
2 голосов
/ 01 апреля 2019

У меня есть следующий вектор v:

c("tactagcaatacgcttgcgttcggtggttaagtatgtataatgcgcgggcttgtcgt",
"tgctatcctgacagttgtcacgctgattggtgtcgttacaatctaacgcatcgccaa",
"gtactagagaactagtgcattagcttatttttttgttatcatgctaaccacccggcg")

Я столкнулся с очень расстраивающей проблемой здесь.Каждый элемент этого вектора представляет собой последовательность ДНК.То, что я хочу сделать, это разделить каждый элемент 2 буквы на 2 и получить количество вхождений каждой пары букв.Желаемый результат будет именно таким для первого элемента:

AA AC AG AT CA CC CG CT GA GC GG GT TA TC TG TT 
 3  2  2  4  1  0  6  3  0  6  4  7  7  2  5  4 

Этот результат легко достигается с помощью функции oligonucleotideFrequency .Проблема в том, что эта функция не будет применяться к списку или вектору, используя sapply или lapply, и я не понимаю, где проблема и как ее исправить.

Если я это сделаю:

oligonucleotideFrequency(DNAString(v[1]), width = 2)

Это работает, и я получаю этот вывод:

AA AC AG AT CA CC CG CT GA GC GG GT TA TC TG TT 
 3  2  2  4  1  0  6  3  0  6  4  7  7  2  5  4

но если я сделаю:

v <- DNAString(v)
lapply(v, oligonucleotideFrequency(v, width = 2)

Это то, что я получаю:

Error in (function (classes, fdef, mtable)  : 
  unable to find an inherited method for function ‘oligonucleotideFrequency’ for signature ‘"list"

То же самое происходит с sapply.

Если я проверяю класс v после применения функции DNAString, он возвращает "list", поэтому я не понимаю, в чем здесь проблема.

Даже если я сделаю:

oligonucleotideFrequency(v[1], width = 2)

, он вернется:

Error in (function (classes, fdef, mtable)  : 
  unable to find an inherited method for function ‘oligonucleotideFrequency’ for signature ‘"list"’

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

PD: Пакет R, содержащий эту функцию, называется Biostrings, и его можно загрузить и установить с здесь

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Существует два способа использования функции lapply.

Первый - предоставить пользовательскую функцию и установить все аргументы внутри функции, как показано ниже.

library(Biostrings)

v <- c("tactagcaatacgcttgcgttcggtggttaagtatgtataatgcgcgggcttgtcgt",
       "tgctatcctgacagttgtcacgctgattggtgtcgttacaatctaacgcatcgccaa",
       "gtactagagaactagtgcattagcttatttttttgttatcatgctaaccacccggcg")


lapply(v, function(x) oligonucleotideFrequency(DNAString(x), width = 2))
# [[1]]
# AA AC AG AT CA CC CG CT GA GC GG GT TA TC TG TT 
# 3  2  2  4  1  0  6  3  0  6  4  7  7  2  5  4 
# 
# [[2]]
# AA AC AG AT CA CC CG CT GA GC GG GT TA TC TG TT 
# 3  4  1  4  5  2  4  4  2  4  1  5  3  5  6  3 
# 
# [[3]]
# AA AC AG AT CA CC CG CT GA GC GG GT TA TC TG TT 
# 2  4  4  4  3  3  2  4  2  4  1  3  7  1  3  9 

Второй - предоставить имя функции и указать аргументы типа ... следующим образом. Для этой опции элемент в списке (в данном случае v) автоматически переходит к первому аргументу функции.

library(Biostrings)

v <- c("tactagcaatacgcttgcgttcggtggttaagtatgtataatgcgcgggcttgtcgt",
       "tgctatcctgacagttgtcacgctgattggtgtcgttacaatctaacgcatcgccaa",
       "gtactagagaactagtgcattagcttatttttttgttatcatgctaaccacccggcg")

v <- lapply(v, DNAString)

lapply(v, oligonucleotideFrequency, width = 2)
# [[1]]
# AA AC AG AT CA CC CG CT GA GC GG GT TA TC TG TT 
# 3  2  2  4  1  0  6  3  0  6  4  7  7  2  5  4 
# 
# [[2]]
# AA AC AG AT CA CC CG CT GA GC GG GT TA TC TG TT 
# 3  4  1  4  5  2  4  4  2  4  1  5  3  5  6  3 
# 
# [[3]]
# AA AC AG AT CA CC CG CT GA GC GG GT TA TC TG TT 
# 2  4  4  4  3  3  2  4  2  4  1  3  7  1  3  9  
1 голос
/ 01 апреля 2019
x = c("tactagcaatacgcttgcgttcggtggttaagtatgtataatgcgcgggcttgtcgt",
      "tgctatcctgacagttgtcacgctgattggtgtcgttacaatctaacgcatcgccaa",
      "gtactagagaactagtgcattagcttatttttttgttatcatgctaaccacccggcg")

nc = c("a", "c", "t", "g")
lv = sort(Reduce(paste0, expand.grid(replicate(2, nc, simplify = FALSE))))
lapply(x, function(s)
    table(factor(sapply(seq(2, nchar(s), 1), function(i)
        substring(s, i - 1, i)),
        levels = lv)))
#[[1]]

#aa ac ag at ca cc cg ct ga gc gg gt ta tc tg tt 
# 3  2  2  4  1  0  6  3  0  6  4  7  7  2  5  4 

#[[2]]

#aa ac ag at ca cc cg ct ga gc gg gt ta tc tg tt 
# 3  4  1  4  5  2  4  4  2  4  1  5  3  5  6  3 

#[[3]]

#aa ac ag at ca cc cg ct ga gc gg gt ta tc tg tt 
# 2  4  4  4  3  3  2  4  2  4  1  3  7  1  3  9 
...