在列表中查找匹配的字符串,只保留匹配的字符串
Find matching string in list and only keep the matching string
我在 R 中有一个列表,其中包含多个字符串,我需要将它们与数据框中的列匹配,并且只保留匹配的字符串。
list <- c('Ford', 'Toyota', 'BMW')
Col1 Col2
1 Ford A1
2 Toyota Prius
3 BMW B2
4 Ford A2
5 Tesla T1
所以我想用list匹配col2然后把数据改成:
Col1 Col2
1 Ford
2 Toyota
3 BMW
4 Ford
5 Tesla T1
您可以使用您的列表创建一个正则表达式字符串,然后可以在 sub
调用中使用它:
regex.string <- paste0( ".*(", paste( list, collapse = "|" ), ").*" )
这使得字符串:
> regex.string
[1] ".*(Ford|Toyota|BMW).*"
现在在子调用中使用它:
df$Col2 <- sub( regex.string, "\1", df$Col2 )
因此正则表达式会查找 list
中包含的任何值,如果找到,它将用找到的值替换整个文本值。
结果:
> df
Col1 Col2
1 1 Ford
2 2 Toyota
3 3 BMW
4 4 Ford
5 5 Tesla T1
注意:如下所述,这可能会破坏包含特殊正则表达式字符的汽车品牌。
我在 R 中有一个列表,其中包含多个字符串,我需要将它们与数据框中的列匹配,并且只保留匹配的字符串。
list <- c('Ford', 'Toyota', 'BMW')
Col1 Col2
1 Ford A1
2 Toyota Prius
3 BMW B2
4 Ford A2
5 Tesla T1
所以我想用list匹配col2然后把数据改成:
Col1 Col2
1 Ford
2 Toyota
3 BMW
4 Ford
5 Tesla T1
您可以使用您的列表创建一个正则表达式字符串,然后可以在 sub
调用中使用它:
regex.string <- paste0( ".*(", paste( list, collapse = "|" ), ").*" )
这使得字符串:
> regex.string
[1] ".*(Ford|Toyota|BMW).*"
现在在子调用中使用它:
df$Col2 <- sub( regex.string, "\1", df$Col2 )
因此正则表达式会查找 list
中包含的任何值,如果找到,它将用找到的值替换整个文本值。
结果:
> df
Col1 Col2
1 1 Ford
2 2 Toyota
3 3 BMW
4 4 Ford
5 5 Tesla T1
注意:如下所述,这可能会破坏包含特殊正则表达式字符的汽车品牌。