我有以下向量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
也会发生同样的情况。
如果我在应用 DNAString
函数后检查 v
的类,它会返回 "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 下载并安装。
提前致谢
最佳答案
有两种方法可以使用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
关于r - 使用 sapply 或 lapply 在向量或列表上按元素应用函数会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55462343/