小编chr*_*ler的帖子

使用R分割字符串和计算字符的速度更快?

我正在寻找一种更快的方法来计算从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)

string optimization r bioinformatics

13
推荐指数
2
解决办法
9605
查看次数

在图的子集之间添加额外的间距

我试图以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)

这是代码输出的内容:


替代文字


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


替代文字


graphics plot r spacing

11
推荐指数
2
解决办法
1万
查看次数

从单列数据框中删除行

当我尝试从单个列数据帧中删除最后一行时,我得到一个向量而不是数据帧:

> 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 rows subset dataframe

6
推荐指数
1
解决办法
2927
查看次数

R优化:在这种情况下如何避免for循环?

我正在尝试在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中写一些东西,但如果可能的话我想避免这样做.任何人都可以提出另一种方法来加速这种计算吗?

optimization intersection r bioinformatics

5
推荐指数
1
解决办法
946
查看次数