检查字符串是否包含 R 中的相同字符

check if a string contains same character in R

Countries <- c("AAAAAAA", sample(c("India","USA","UK","SSS"),20,replace=TRUE))
df1 <- data.frame(Countries)
df1
  

我想检查一个字符串是否包含相同的字符

library(stringi)
df1$All_S<-stri_count_fixed(df1$Countries,"S")==nchar(df1$Countries)
df1

      Countries All_S
  1    AAAAAAA FALSE
  2         UK FALSE
  3      India FALSE
  4      India FALSE
  5        SSS  TRUE
  6         UK FALSE
  7        SSS  TRUE
  8        SSS  TRUE
  9      India FALSE
  10       SSS  TRUE
  11        UK FALSE
  12     India FALSE
  13       SSS  TRUE
  14       USA FALSE
  15        UK FALSE
  16        UK FALSE
  17       SSS  TRUE
  18       SSS  TRUE
  19     India FALSE
  20       USA FALSE
  21       USA FALSE
  

然而,这仅检查字符串是否仅包含“S”。我如何更改它以使其适用于任何字符串。在上面的示例中,这意味着第一个条目 AAAAAAA 也将是 True

我会在这里使用 grepl

df1$All_S <- grepl("^S+$", df1$Countries)

要对任何字母执行上述操作,然后使用:

df1$All_S <- grepl("^(\w)\1*$", df1$Countries)

你可以试试这个

transform(
    df1,
    All_same = grepl("^(.)(\1)+$", Countries)
)

给出类似

的东西
   Countries All_same
1    AAAAAAA     TRUE
2         UK    FALSE
3         UK    FALSE
4         UK    FALSE
5        USA    FALSE
6         UK    FALSE
7        USA    FALSE
8        USA    FALSE
9        USA    FALSE
10        UK    FALSE
11     India    FALSE
12       SSS     TRUE
13       USA    FALSE
14       USA    FALSE
15     India    FALSE
16       USA    FALSE
17        UK    FALSE
18       SSS     TRUE
19     India    FALSE
20        UK    FALSE
21        UK    FALSE

另一种可能性:

sapply(strsplit(df1$Countries, ""), function(x) all(x == x[1]))

“我想检查一个字符串是否包含相同的字符”——这留下了

的可能性
  • (i) 字符串也包含 not-same 个字符 ("AAB")
  • (ii) 相同的字符可以但不必相邻(例如,“ABA”)
  • (iii) 字符串包含 个相同的字符

这三个条件要求的正则表达式解决方案略有不同:

解法(一):

df1 %>%
  mutate(Same = str_detect(Countries, "(.)\1+"))

三种情况需要不同的解决方案:

解法(二):

df1 %>%
  mutate(Same = str_detect(Countries, "(.).*\1+"))

解法(三):

df1 %>%
  mutate(Same = str_detect(Countries, "^(.)\1+$"))