看板 R_Language 關於我們 聯絡資訊
[問題類型]: 效能諮詢(我想讓R 跑更快) [軟體熟悉度]: 入門(寫過其他程式,只是對語法不熟悉) [問題敘述]: 我想要統計一個英文字串中,雙字母的出現次數,例如: <input> aabaaa abbacazz input aa ab ac ad ... az ba bb bc ... ca cb cc ... zz aabaaa 3 1 0 0 0 1 0 0 0 0 0 0 abbacazz 0 1 1 0 1 1 1 0 1 0 0 1 輸入資料是一個csv檔,內含一個欄位<input>,每一筆(行)內容即為一個英文字串 輸出資料是新增aa~zz共676個欄位, 每一行的英文字串後,加入雙字母的出現次數,未出現的為0次 下述程式碼是我目前想到的,但是雙迴圈執行mutate(程式第4~10行),過程速度很慢 想請教對於雙字元的統計 是否有更好、執行效率更高的寫法? [程式範例]: 以下圖片為程式碼與註解 https://imgur.com/utlNEB7 以下為程式碼原文 file_csv<- read.csv("test.csv",header=TRUE,sep=",") n <- 1:nrow(file_csv) patt <- NULL for(i in 0:25){ for(j in 0:25){ tmp_2char <- paste(intToChar(97+i),intToChar(97+j),sep="") patt <- c(patt,tmp_2char) file_csv<-mutate(file_csv,!!tmp_2char:=0) } } m <- length(patt) for(x in n){ tmp_input <- tolower(as.character(file_csv$input[x])) file_csv[x,2:(m+1)] <- str_count(tmp_input,patt) } [環境敘述]: R version 3.5.1 (2018-07-02) Platform: x86_64-w64-mingw32/x64 (64-bit) Running under: Windows >= 8 x64 (build 9200) [關鍵字]: mutate str_count 雙字元出現次數 -- 「那女怪,活潑潑,春意無邊;這長老,死丁丁,禪機有在。一個 似軟玉溫香,一個如死灰槁木。」 《西遊記.第五五回》 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.126.132.70 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1544418029.A.321.html
andrew43: 參考看看。結構上也是雙層(一個for一個sapply)。 12/10 13:39
andrew43: 主要是靠 gregexpr() https://ideone.com/AKO8tG 12/10 13:40
andrew43: 這應該不算快。10000個字串大概要16秒。 12/10 13:43
x88776544pc: 先切字串再計數如何 https://ideone.com/0m24lP 12/10 14:07
obarisk: nse的cost蠻大的 12/10 19:16
celestialgod: https://pastebin.com/Der1EbFy 一萬個大概6秒 12/10 23:33
Chihuah: 感謝前面幾位前輩的分享 獲益良多~ 又學到一些技巧了 12/13 12:26