看板 R_Language 關於我們 聯絡資訊
※ 引述《eco100 ( )》之銘言: : 不好意思,我又有另一個問題 : 例如我有一個字串 "ABCABACBA" : 我要計算前後相鄰二個字元出現的次數 : 例如一開始 AB 再來 BC CA AB.... : 可以得到以下結果 AB BC CA BA AC CB : 2 1 1 2 1 1 : 我想到也是只能用迴圈往後一個字元一個字元移動 : 請問有更快的方式嗎? 感謝! x <- c("ABACABCB", "CBACABCBACBAB") cal_func <- function(x, cal_length = 2L){ # 把字串切割成一個個character,丟進function lapply(strsplit(x, ""), function(ss){ # 計算組數 l <- ceiling(length(ss) / cal_length) # split的vec tableVec <- rep(1L:l, each = cal_length, length = length(ss)) out <- do.call(c, lapply(1L:cal_length, function(i){ # 用split的vec切割,然後黏貼在一起 # 每做一次就在前面補一個NA => # 第一次分組是 11223344 # 第二次分組是 N1122334 (4沒有成兩組所以不計,N是NA) # 這段邏輯可以要細想一下~~~ tmp <- split(ss, c(rep(NA_integer_, i - 1L), head(tableVec, length(tableVec) - i + 1L))) sapply(tmp[sapply(tmp, length) == cal_length], paste, collapse = "") })) return(table(as.vector(out))) }) } cal_func(x, 2L) # [[1]] # # AB AC BA BC CA CB # 2 1 1 1 1 1 # # [[2]] # # AB AC BA BC CA CB # 2 2 3 1 1 3 cal_func(x, 3L) # [[1]] # # ABA ABC ACA BAC BCB CAB # 1 1 1 1 1 1 # # [[2]] # # ABC ACA ACB BAB BAC BCB CAB CBA # 1 1 1 1 2 1 1 3 3以上,你自己驗證看看吧~~ -- R資料整理套件系列文: magrittr #1LhSWhpH (R_Language) https://goo.gl/72l1m9 data.table #1LhW7Tvj (R_Language) https://goo.gl/PZa6Ue dplyr(上.下) #1LhpJCfB,#1Lhw8b-s (R_Language) https://goo.gl/I5xX9b tidyr #1Liqls1R (R_Language) https://goo.gl/i7yzAz pipeR #1NXESRm5 (R_Language) https://goo.gl/zRUISx -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.235.90.162 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1490185338.A.2D7.html
eco100: 太感謝了!雖然有些還看不懂 今天我會試試看的! 03/23 09:48