首页 > 解决方案 > 从R中的模式中提取单个唯一字符

问题描述

我有一个独特的字符向量的数据框,它们都与不同的模式非常相似,但每个都有很小的偏差。我希望找到一种方法来识别每个字符串中的偏差。这是我尝试过的:

library(stringr)

#The strings are concatenated in my code, I separated them for easier use

KeyPattern <- c('abcd'
uniqchars <- function(x) unique(strsplit(x, "")[[1]]) 
KayPattern <- uniqchars(KeyPattern)

> KeyPattern
[1] "a" "b" "c" "d"

SampleString <- c('a', 'b', 'z', 'c', 'd')



str_detect(SampleString, KeyPattern)

[1] TRUE TRUE FALSE FALSE FALSE

如您所见,它识别了“z”字符,并正确返回 FALSE,从那里模式完全关闭。我也考虑过尝试:

word(string, start = 1L, end = start, sep = fixed(" "))

但这需要预先知道偏差在哪里(开始 = ...,结束 = ...),并且在数据帧的每一行中都会有所不同。

最终,我想要一个数据框,其中包含一列唯一字符串、一列不同偏差(模式中的不匹配),以及它在字符串中的位置。

目标样本表:

细绳 偏离键 偏差起始位置
'a' 'b' 'c' 'z' 'd' z 4
'a' 'b' 'a' 'c' 'd' 一个 3

当前连接的数据框:


1                                  ASGGGGSAASHLIALQLRLIGDAFDGGGGSGGGGSG
2                        ASLTVDVGNVTYHFNNPITVLVFAILVALELGGTVHVHGNRIHVEG
3                        ASLTVHVGDLTYHFENPQLVKLVAEIWARALNLTIEIRGNEIHVEG
4                        ASNELVELVVEILYRMCVDPDQIKKILKRRGVSDEEVKRAIDKAIG
5 ASNMNMLEALQQRLQFYFGVVSRAALENNSGKARRFGRIVKQYEDAIKLYKAGKPVPYDELPVPPGFGG
6 ASNTIMLEALQQRLQFYFGVVSRAALENNSGKARRFGRIVKQYEDAIKLYKAGKPVPYDELPVPPGFGG

#CurrentKey
[1] "ASSTNMLEALQQRLQFYFGVVSRALENNSGKARRFGRIVKQYEDAIKLYKAGKPVPYDELPVPPGFGG"

有什么建议么?

标签: rpattern-matchingstringr

解决方案


看看这是不是你想要的?

df <- structure(list(STRINGS = list(c("a", "b", "c", "z", "d"), c("a", 
                                                                  "b", "a", "c", "d"))), class = "data.frame", row.names = c(NA, 
                                                                                                                             -2L))

df
#>         STRINGS
#> 1 a, b, c, z, d
#> 2 a, b, a, c, d

pattern <- c('a', 'b', 'c', 'd')

library(tidyverse)

df %>%
  mutate(deviation = map_chr(STRINGS, ~  {x <- cumsum(.x[seq_along(pattern)] != pattern); .x[which(x >0)[1]]}),
         deviation_start_loc = map_int(STRINGS, ~  {x <- cumsum(.x[seq_along(pattern)] != pattern); which(x > 0)[1]}))

#>         STRINGS deviation deviation_start_loc
#> 1 a, b, c, z, d         z                   4
#> 2 a, b, a, c, d         a                   3

reprex 包于 2021-06-21 创建 (v2.0.0 )


推荐阅读