[筆記] R有沒有function可以做字元sorting?
目前我是這樣寫
但處理一億多筆資料很辛苦
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
推
09/24 22:37, , 1F
09/24 22:37, 1F
→
09/24 23:05, , 2F
09/24 23:05, 2F
推
09/24 23:41, , 3F
09/24 23:41, 3F
→
09/25 00:31, , 4F
09/25 00:31, 4F
寫法三
推
09/25 01:26, , 5F
09/25 01:26, 5F
寫法二
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 的邏輯是甚麼
→
09/25 11:51, , 6F
09/25 11:51, 6F
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)