【问题标题】:Applying a function element-wise on a vector or list would fail using sapply or lapply使用 sapply 或 lapply 在向量或列表上逐元素应用函数将失败
【发布时间】:2019-08-23 01:05:57
【问题描述】:

我有以下向量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(v, oligonucleotideFrequency, width = 2)
  • 该死的。塔工作!我很惭愧它是如此简单。真的非常感谢。将其发布为答案,我将非常乐意接受它
  • 我已扩展我的评论作为答案。谢谢。

标签: r function vector lapply dna-sequence


【解决方案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 

【讨论】:

  • 谢谢 d.b.它确实可以完成工作,但我正在寻找的是一种在整个列表中实现 oligonucleotideFrequency 函数的方法
【解决方案2】:

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  

【讨论】:

  • 谢谢万维网!!这正是我想要的!我必须继续学习:)
  • 现在我还有一个问题,如果可以的话:想象一下我有一个数据框,我的一个特征是主要问题的前一个向量。我想让序列中的每一对字母成为数据框的一个特征,它的值将是所有字母对的总数。它会是这样的:feature1:AA。功能2:交流电等。并且值将类似于:对于 AA,它应该是 8,对于 AC 10,等等每个特征。我怎么能做到这一点?
  • @Miguel2488 我想我可能知道该怎么做,但如果你不介意,你能用可重现的例子问一个新问题吗,比如数据框和你想要的列表结合?一旦你发布它,我会研究你的可重现的例子。
  • 好的,我会创建一个新问题并在完成后将其链接到您这里。请给我一分钟:)
  • 嗨 www,这里是 question。非常感谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多