作者gsuper (数理统计-九阳真经)
看板Statistics
标题[问题] R有没有function可以做字元sorting?
时间Sat Sep 24 22:08:25 2011
目前我是这样写
但处理一亿多笔资料很辛苦
a <- strsplit(一串字元向量,split="")
b <- lapply(a,sort)
c <- sapply(b,paste,collapse="")
--------------------------------------------------
Request:
字元向量 c("GA","AG","CT")
想排成 c(
"AG","AG","CT")
1. 向量顺序不变
2. 字串字元按顺序排列
请问有没有快速的 function 可用?
--
祭颂后灵的骑士道与白主教稳守黄金乡
边境兵躁动自高自大妄入堡垒
黑主教冷静人格分裂
笼城王与双子战塔一筹莫展
掌握无限的魔女唤醒躺下的灵魂
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.113.239.247
1F:推 Wush978:有没有考虑使用python之类的其他语言? 09/24 22:37
2F:→ gsuper:不会写 是有想学 perl 不过没时间 09/24 23:05
3F:推 rockken:order? 09/24 23:41
4F:→ bmka:ACTG排列的可能性有限,直接用if.. then..把"GA"换"AG"就好 09/25 00:31
写法三
5F:推 LITTLEN:先取代再order....gsub function查一下... 09/25 01:26
写法二
gsub 我知道
你说的写法应该是
fx2 <- function(tmp)
{
tmp <- gsub("CA","AC",tmp)
tmp <- gsub("GA","AG",tmp)
tmp <- gsub("TA","AT",tmp)
tmp <- gsub("GC","CG",tmp)
tmp <- gsub("TC","CT",tmp)
tmp <- gsub("TG","GT",tmp)
return(tmp)
}
我等等测试一下时间
感觉是比切开再贴上合理
不过我不太懂要用 order 的逻辑是甚麽
6F:→ clickhere:2. 的用意何在? 比较A/G在字串中出现频率? 有必要paste? 09/25 11:51
A. 因为我不只是要计算 allele frequency
还要计算 Genotype frequency
B. 先 paste 好是额外要给网页端做读取 (我是计算端)
不然网页每读一次要重组一次字元很不合理
--------------------------------------------------------------
现在来测试
1.我原本的写法
2.gsub写法
3.index写法
因为我对 gsub 印象不太好 (有时候速度很慢)
--------------------------------------------------------------
写法一(我目前的写法)
fx2 <- function(tmp) ### tmp 是字串向量
{
index <- tmp %in% c("CA","GA","TA","GC","TC","TG")
if(sum(index)==0){return(tmp)}
tmp2 <- tmp[index]
tmp2 <- sapply(lapply(strsplit(tmp2,split=""),sort),paste,collapse="")
tmp[index] <- tmp2
return(tmp)
}
--------------------------------------------------------------
写法二
fx2 <- function(tmp)
{
tmp <- gsub("CA","AC",tmp)
tmp <- gsub("GA","AG",tmp)
tmp <- gsub("TA","AT",tmp)
tmp <- gsub("GC","CG",tmp)
tmp <- gsub("TC","CT",tmp)
tmp <- gsub("TG","GT",tmp)
return(tmp)
}
--------------------------------------------------------------
写法三(猜测大概跟2差不多)
fx2 <- function(tmp)
{
tmp[tmp%in%"CA"] <- "AC"
tmp[tmp%in%"GA"] <- "AG"
tmp[tmp%in%"TA"] <- "AT"
tmp[tmp%in%"GC"] <- "CG"
tmp[tmp%in%"TC"] <- "CT"
tmp[tmp%in%"TG"] <- "GT"
return(tmp)
}
※ 编辑: gsuper 来自: 140.113.239.247 (09/26 14:02)
※ 编辑: gsuper 来自: 140.113.239.247 (09/26 14:11)
资料 423*1094 的 Genotype "DATA" 矩阵 (这是总档案的一部分)
用system.time(apply(data,2,fx2))[3]
写法一(切开再黏合) : 11秒以上 (我的写法超烂)
写法二(gsub) : 0.9秒左右 (LITTLEN)
写法三(index) : 0.2秒左右 (BMKA)
看起来 BMKA 大大的写法乐胜
谢谢大家帮忙
※ 编辑: gsuper 来自: 140.113.239.247 (09/26 14:24)
写法三的延伸 : 0.14秒
乾脆连 apply 都不要用最快
DATA[DATA=="CA"] <- "AC"
DATA[DATA=="GA"] <- "AG"
DATA[DATA=="TA"] <- "AT"
DATA[DATA=="GC"] <- "CG"
DATA[DATA=="TC"] <- "CT"
DATA[DATA=="TG"] <- "GT"
※ 编辑: gsuper 来自: 140.113.239.247 (09/26 14:43)
※ 编辑: gsuper 来自: 140.113.239.247 (09/26 14:46)
※ 编辑: gsuper 来自: 140.113.239.247 (09/26 14:46)
※ 编辑: gsuper 来自: 140.113.239.247 (09/26 14:48)
※ 编辑: gsuper 来自: 140.113.239.247 (09/26 15:16)
※ 编辑: gsuper 来自: 140.113.239.247 (09/26 15:19)