使用sapply或lapply

时间:2019-04-01 19:35:02

标签: r function vector lapply dna-sequence

我有以下向量v

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

我在这里面临一个非常令人沮丧的问题。该载体的每个元件都是DNA序列。我想要做的是将每个元素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,可以从here下载并安装

预先感谢

2 个答案:

答案 0 :(得分:1)

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 

答案 1 :(得分:1)

有两种使用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