[筆記] R有沒有function可以做字元sorting?

看板Statistics作者 (數理統計-九陽真經)時間14年前 (2011/09/24 22:08), 編輯推噓3(303)
留言6則, 6人參與, 最新討論串1/1
目前我是這樣寫 但處理一億多筆資料很辛苦 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
有沒有考慮使用python之類的其他語言?
09/24 22:37, 1F

09/24 23:05, , 2F
不會寫 是有想學 perl 不過沒時間
09/24 23:05, 2F

09/24 23:41, , 3F
order?
09/24 23:41, 3F

09/25 00:31, , 4F
ACTG排列的可能性有限,直接用if.. then..把"GA"換"AG"就好
09/25 00:31, 4F
寫法三

09/25 01:26, , 5F
先取代再order....gsub function查一下...
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
2. 的用意何在? 比較A/G在字串中出現頻率? 有必要paste?
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)
文章代碼(AID): #1EVUHWJJ (Statistics)