r - 使用 sapply 或 lapply 在向量或列表上按元素应用函数会失败

标签 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 也会发生同样的情况。

如果我在应用 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/

相关文章:

R Shiny -启用键盘快捷键?

r - 列表的行列表

javascript - D3.js 加载完成后缩放特定路径

javascript 定义参数

mysql - 在 MySQL 5.0.5 中创建存储函数时出错

c++ - 我可以使用 ' == ' 来比较两个 vector 吗?我试过了,似乎工作正常。但我不知道它是否适用于更复杂的情况

c++ - C++14 中 vector 的 unordered_map 和 erase-remove 习语的奇怪行为

r - 在向量列表中,将每个向量转换为字符串,然后转换为 R 中的数据帧

r - 将满足特定条件的所有行分组

c++ - vector 加上 unique_ptr 到一个对象,内存没有释放?