使用 sapply 或 lapply 在向量或列表上按元素应用函数会失败
Applying a function element-wise on a vector or list would fail using sapply or lapply
我有以下向量 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
的 class returns "list"
所以我不知道问题在哪里.
即使我这样做:
oligonucleotideFrequency(v[1], width = 2)
它returns:
Error in (function (classes, fdef, mtable) :
unable to find an inherited method for function ‘oligonucleotideFrequency’ for signature ‘"list"’
我完全os不在这里,请帮忙,我已经花了好几个小时来解决这个问题,我该如何解决这个问题??我想立即将此函数应用于整个向量。
PD: 包含此功能的 R 包 os 称为 Biostrings
可以从 here
下载和安装
提前致谢
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
有两种方法可以使用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
我有以下向量 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
的 class returns "list"
所以我不知道问题在哪里.
即使我这样做:
oligonucleotideFrequency(v[1], width = 2)
它returns:
Error in (function (classes, fdef, mtable) :
unable to find an inherited method for function ‘oligonucleotideFrequency’ for signature ‘"list"’
我完全os不在这里,请帮忙,我已经花了好几个小时来解决这个问题,我该如何解决这个问题??我想立即将此函数应用于整个向量。
PD: 包含此功能的 R 包 os 称为 Biostrings
可以从 here
提前致谢
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
有两种方法可以使用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