全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
1331 7
2012-05-28
一段一亿长“acgt”序列序列L,目标是寻找这条序列里面长度为n长的子串个数。目前我的算法就是遍历一遍,然后取出每个子串,之后用R的table()函数得出结果。table()的效率很高,慢就慢在循环上面,请教高手指点!谢谢!

L="acgt...............gcta..................................aaccgt" #总共是1亿长
a=c("")  

   for(i in 1:100000000)
    {
       a[i]=substr(L,i,i+n-1)
     }
    b=table(a)
    print(b)

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2012-5-28 19:30:07
建议用C
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-5-28 19:59:47
向量化
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-5-28 22:16:34
你原来那个用循环的方法#1太慢。
#2用的apply,速度也不行
#3走了个捷径,速度好一些,长度1千万的用了两分钟

len <- 10000000
L <- sample(c("a", "c", "g", "t"), size = len, replace = T)
L <- paste(L, collapse = "")
a <- c("")
n <- 4

# 1
#system.time(for(i in 1:(len-n+1)) a[i]=substr(L,i,i+n-1))

# 2
ind1 <- 1:(len-n+1)
ind2 <- n:len
ind <- cbind(ind1, ind2)
getString <- function(nn) substr(L, nn[1], nn[2])
ptm <- proc.time()
out <- apply(ind, 1, getString)
proc.time() - ptm

# 3
ptm <- proc.time()
L <- strsplit(L, split = "")[[1]]
mat <- matrix(NA, nrow = (len-n+1), ncol = n)
for (i in 1:n) {
   mat[, i] <- L[i:(len-n+i)]
}
out2 <- apply(mat, 1, paste, collapse = "")
proc.time() - ptm

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-5-28 23:53:13
qoiqpwqr 发表于 2012-5-28 22:16
你原来那个用循环的方法#1太慢。
#2用的apply,速度也不行
#3走了个捷径,速度好一些,长度1千万的用了两 ...
非常感谢!我测试了一下 耗时主要在substr()这句上面。1千万2分钟,那么一个亿 就得20多分钟,如果我的n in 1:20 的话也就意味着要400分钟。不知道用R调用C 或者perl 能否快些?谢谢!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-5-29 00:04:20
microtan 发表于 2012-5-28 23:53
非常感谢!我测试了一下 耗时主要在substr()这句上面。1千万2分钟,那么一个亿 就得20多分钟,如果我的 ...
C会快很多。Perl不知道,没用过。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群