作者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)