比较两个字符串大小_R怎么比较两个字符串的差异

假设你有序列AAA和ATA,怎么用R比较它们的差异,即第二个字符,并返回差异的位点与字符?

我用谷歌搜索这个问题时发现stackoverflow上有类似的提问,但不完全一致,基本就是问找出差异的字符,并没有我想要的这么全。提供的解决方案有两种:

do.call(setdiff, strsplit(c(a, b), split = ""))
# 或者
Reduce(setdiff, strsplit(c(a, b), split = ""))

a,b是两个字符串。

> do.call(setdiff, strsplit(c("ATA", "AAA"), split = ""))
[1] "T"
> Reduce(setdiff, strsplit(c("ATA", "AAA"), split = ""))
[1] "T"

神奇的是,如果你将两个序列呼唤,就不work了!

> Reduce(setdiff, strsplit(c("AAA", "ATA"), split = ""))
character(0)
> do.call(setdiff, strsplit(c("AAA", "ATA"), split = ""))
character(0)

相关资料不多,终于在R博客看到一个实现类似需求的函数,修改了一下,感觉很棒:

list_string_diff = function(a, b, exclude = c("-", "?"), ignore.case = TRUE, show.excluded = FALSE, only.position = TRUE){
if(nchar(a)!=nchar(b)) stop("Lengths of input strings differ")
if(ignore.case){
a = toupper(a)
b = toupper(b)
}

split_seqs = strsplit(c(a, b), split = "")
only.diff = split_seqs[[1]] != split_seqs[[2]]
only.diff[
(split_seqs[[1]] %in% exclude) |
(split_seqs[[2]] %in% exclude)
] = NA

diff.info = data.frame(which(is.na(only.diff)|only.diff),
split_seqs[[1]][only.diff], split_seqs[[2]][only.diff])
names(diff.info) = c("position", "seq.a", "seq.b")

if(!show.excluded) diff.info = na.omit(diff.info)
if(only.position){
diff.info$position
}else diff.info
}

这个函数 可以同时记录位置和原始序列,并可以忽略大小写,甚至排除一些序列,为了使结果简化,我添加了只返回位置的默认参数。

> list_string_diff("AAA", "ATA")
[1] 2
> list_string_diff("ATA", "AAA")
[1] 2
> list_string_diff("ATA", "AAA", only.position = FALSE)
position seq.a seq.b
1 2 T A
> list_string_diff("ATA", "AAa", only.position = FALSE)
position seq.a seq.b
1 2 T A
> list_string_diff("ATA", "AAa", only.position = FALSE, ignore.case = FALSE)
position seq.a seq.b
1 2 T A
2 3 A a
2f21bdd187fbc4e51eb43aa1c88f2651.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值