作者celestialgod (天)
看板R_Language
标题Re: [问题] 字串元素个数计算跟加总?
时间Wed Mar 22 20:22:14 2017
※ 引述《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://webptt.com/cn.aspx?n=bbs/R_Language/M.1490185338.A.2D7.html
1F:→ eco100: 太感谢了!虽然有些还看不懂 今天我会试试看的! 03/23 09:48