R语言:生成忽略指定字符的序列计数等长向量
解决R语言中忽略指定字符的连续计数问题
这需求很典型,我给你几个实用的R实现方案,轻松搞定这个等长向量的计数任务:
基础R实现(无需额外包)
最直接的方式是利用cumsum()函数结合逻辑判断,一步到位:
# 你的原始向量 seq <- c("c","t","c","t","c","c","t","a","t", "g", "g", "c", "g", "g", "g", "a", "a", "g", "c", "-", "-", "a", "a","-", "-", "-", "c", "t", "g") # 指定起始数 start_num <- 1000 # 第一步:标记非"-"的位置 non_dash_flag <- seq != "-" # 第二步:计算连续计数,非"-"位置递增,"-"位置设为NA(可按需替换为其他值) out_vec <- start_num + cumsum(non_dash_flag) - 1 out_vec[!non_dash_flag] <- NA
运行后out_vec就和seq长度完全一致:
- 所有非"-"的位置从1000开始连续递增计数
- "-"对应的位置会被设为
NA,如果想保留"-"字符,只需把最后一行改成out_vec[!non_dash_flag] <- "-"(此时向量会变成字符类型)
tidyverse风格实现(更简洁的管道写法)
如果你习惯用tidyverse工具链,用dplyr的语法可以让代码更易读:
library(dplyr) out_vec <- seq %>% # 生成计数序列 {start_num + cumsum(. != "-") - 1} %>% # 将"-"对应的位置替换为NA replace(seq == "-", NA)
效果验证
拿你的例子来说,前19个元素都是非"-",所以对应1000到1018;第20、21位是"-",对应NA;第22、23位的"a"会接着前面的计数,变成1019、1020,以此类推,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Powege
相关产品推荐
相关产品推荐

