检查字符串是否包含 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+$"))
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+$"))