r-如何找到相似字符串之间的差异



我有一个字符串向量(确切地说是文件名(。

pav <- c("Sn_4Khz_3W_45_130_02_30cm_101mm_",
"Sn_4Khz_4W_45_130_02_30cm_101mm_",
"Sn_4Khz_4W_50_130_02_30cm_101mm_")

我正在寻找一种简单的方法来找出这些字符串之间的区别。

`> char_position_fun(pav) # gives unique character position
[1] 9 12 13 `

`> char_diff_fun(pav) # removes matching components (position and value)
[1] 3_4_5  4_4_5  4_5_0`

这是我的尝试。我决定拆分所有字母,并为每个包含位置和字母信息的字符串创建一个数据帧。然后,对于每个职位,我检查是否有一个唯一的字母。如果为FALSE,则表示并非所有字母都相同。最后,用逻辑条件对数据帧进行子集处理。通过这种方式,您可以同时查看职位和信件信息。

library(tidyverse)
strsplit(mytext, split = "") %>% 
map_dfr(.x = .,
.f = function(x) enframe(x, name = "position", value = "word"),
.id = "id") %>% 
group_by(position) %>% 
mutate(check = n_distinct(word) == 1) %>% 
filter(check == FALSE)
id    position word  check
<chr>    <int> <chr> <lgl>
1 1            9 3     FALSE
2 1           12 4     FALSE
3 1           13 5     FALSE
4 2            9 4     FALSE
5 2           12 4     FALSE
6 2           13 5     FALSE
7 3            9 4     FALSE
8 3           12 5     FALSE
9 3           13 0     FALSE

如果你想得到你所描述的结果,你可以添加更多的操作。

strsplit(mytext, split = "") %>% 
map_dfr(.x = .,
.f = function(x) enframe(x, name = "position", value = "word"),
.id = "id") %>% 
group_by(position) %>% 
mutate(check = n_distinct(word) == 1) %>% 
filter(check == FALSE) %>% 
group_by(id) %>% 
summarize_at(vars(position:word),
.funs = list(~paste0(., collapse = "_")))
id    position word 
<chr> <chr>    <chr>
1 1     9_12_13  3_4_5
2 2     9_12_13  4_4_5
3 3     9_12_13  4_5_0

数据

mytext <- c("Sn_4Khz_3W_45_130_02_30cm_101mm_", "Sn_4Khz_4W_45_130_02_30cm_101mm_", 
"Sn_4Khz_4W_50_130_02_30cm_101mm_")

这里是一个基本的R解决方案。

首先,我们可以将字符串从UTF8反转为Int,即

z <- Map(utf8ToInt,v)
  • 差异的位置
pos <- unique(unlist(outer(z,z,FUN = Vectorize(function(x,y) which(x!=y)))))
> pos
[1]  9 12 13
  • 不同的字符:
word <- Map(function(x) paste(intToUtf8(x[p],multiple = T),collapse = "_"),z)
> word
$Sn_4Khz_3W_45_130_02_30cm_101mm_
[1] "3_4_5"
$Sn_4Khz_4W_45_130_02_30cm_101mm_
[1] "4_4_5"
$Sn_4Khz_4W_50_130_02_30cm_101mm_
[1] "4_5_0"

数据

v <- c("Sn_4Khz_3W_45_130_02_30cm_101mm_", "Sn_4Khz_4W_45_130_02_30cm_101mm_", 
"Sn_4Khz_4W_50_130_02_30cm_101mm_")

最新更新