我正在寻找一种更快的方法来计算从FASTA文件读入的DNA字符串的GC内容.这归结为取一个字符串并计算字母'G'或'C'出现的次数.我还想指定要考虑的字符范围.
我有一个相当慢的工作函数,它导致我的代码瓶颈.它看起来像这样:
##
## count the number of GCs in the characters between start and stop
##
gcCount <- function(line, st, sp){
chars = strsplit(as.character(line),"")[[1]]
numGC = 0
for(j in st:sp){
##nested ifs faster than an OR (|) construction
if(chars[[j]] == "g"){
numGC <- numGC + 1
}else if(chars[[j]] == "G"){
numGC <- numGC + 1
}else if(chars[[j]] == "c"){
numGC <- numGC + 1
}else if(chars[[j]] == "C"){
numGC <- numGC + 1
}
}
return(numGC)
}
Run Code Online (Sandbox Code Playgroud)
运行Rprof给我以下输出:
> …Run Code Online (Sandbox Code Playgroud) 我试图以3x2布局将6个数字输出到一个图像中.我想在顶行和底行两行之间留出额外的空间.这可能使用R吗?我查看了par和plot的文档,似乎无法找到合适的选项.
这是一些示例代码:
a = rnorm(100,100,10)
b = rnorm(100,100,10)
par(mfrow=c(3,2), oma=c(1,1,1,1), mar=c(2,2,2,2))
hist(a)
hist(b)
plot(a,b)
plot(a,b)
plot(a,b)
plot(a,b)
Run Code Online (Sandbox Code Playgroud)
这是代码输出的内容:

这是我想要输出的内容(我在外部编辑器中修改了这个图像).请注意顶行和底行之间的额外空间.

当我尝试从单个列数据帧中删除最后一行时,我得到一个向量而不是数据帧:
> df = data.frame(a=1:10)
> df
a
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
> df[-(length(df[,1])),]
[1] 1 2 3 4 5 6 7 8 9
Run Code Online (Sandbox Code Playgroud)
我正在寻找的行为是当我在两列数据帧上使用此命令时会发生什么:
> df = data.frame(a=1:10,b=11:20)
> df
a b
1 1 11
2 2 12
3 3 13
4 4 14
5 5 15
6 6 16
7 7 17
8 8 18
9 9 19
10 10 20
> …Run Code Online (Sandbox Code Playgroud) 我正在尝试在R中进行简单的基因组轨道交叉,并遇到主要的性能问题,可能与我使用for循环有关.
在这种情况下,我有100bp的预定义窗口,我试图计算mylist中的注释覆盖了多少窗口.从图形上看,它看起来像这样:
0 100 200 300 400 500 600
windows: |-----|-----|-----|-----|-----|-----|
mylist: |-| |-----------|
Run Code Online (Sandbox Code Playgroud)
所以我写了一些代码来做到这一点,但它相当慢,并成为我的代码的瓶颈:
##window for each 100-bp segment
windows <- numeric(6)
##second track
mylist = vector("list")
mylist[[1]] = c(1,20)
mylist[[2]] = c(120,320)
##do the intersection
for(i in 1:length(mylist)){
st <- floor(mylist[[i]][1]/100)+1
sp <- floor(mylist[[i]][2]/100)+1
for(j in st:sp){
b <- max((j-1)*100, mylist[[i]][1])
e <- min(j*100, mylist[[i]][2])
windows[j] <- windows[j] + e - b + 1
}
}
print(windows)
[1] 20 81 101 21 0 0
Run Code Online (Sandbox Code Playgroud)
当然,这用于比我在此提供的示例大得多的数据集.通过一些剖析,我可以看到的瓶颈是在for循环,但我的笨拙尝试使用向量化它*应用功能,导致更多的运行速度慢一个数量级的代码.
我想我可以在C中写一些东西,但如果可能的话我想避免这样做.任何人都可以提出另一种方法来加速这种计算吗?
r ×4
optimization ×2
dataframe ×1
graphics ×1
intersection ×1
plot ×1
rows ×1
spacing ×1
string ×1
subset ×1