1

我有一列值为

“RED LOBSTER CA04606”或“Red Lobster NewYork WY245”n 等等

如何从中提取名称 Red Lobster 或 Red Lobster NewYork。我正在尝试使用 stringr 包。
有没有办法检查它是否只有文本并且可以忽略其中带有数字的值?

非常感谢任何帮助。谢谢

4

5 回答 5

3

尝试gsub

> x <- "RED LOBSTER CA04606"
> gsub("\\S*\\d+\\S*",'', x)
[1] "RED LOBSTER "

> x<-"Red Lobster NewYork WY245"
> gsub("\\S*\\d+\\S*",'', x)
[1] "Red Lobster NewYork "

> x<-"Red Lobster NewYork WY245 BLUE LOBSTER CA04606"
> gsub("\\S*\\d+\\S*",'', x)
[1] "Red Lobster NewYork  BLUE LOBSTER "
于 2013-04-03T05:02:40.080 回答
3

由于您正在尝试使用stringr,我建议str_extract(即使您不尝试使用,我也会推荐它stringr):

x <- c('RED LOBTSER CA04606', 'Red Lobster NewYork WY245')
str_extract(x, '[a-zA-Z ]+\\b')
# [1] "RED LOBSTER "          "Red Lobster NewYork "

正则表达式中的 '\b' 可防止提取 'CA04606' 中的 'CA'。

如果您不喜欢那个尾随空格,您可以使用str_trim它来删除它,或者您可以修改正则表达式:

str_extract(x, '[a-zA-Z]+(?: +[a-zA-Z]+)*\\b')
# [1] "RED LOBSTER"          "Red Lobster NewYork"

注意 - 如果您的字符串在邮政编码有非数字,则上面只返回之前的单词。所以在下面的例子中,如果你想在'WY245'之后得到'NewYork',你可以使用str_extract_all并将结果粘贴在一起:

x <- c(x, 'Red Lobster WY245 NewYork')
str_extract_all(x, '[a-zA-Z]+(?: +[a-zA-Z]+)*\\b')
# [[1]]
# [1] "RED LOBSTER"
# 
# [[2]]
# [1] "Red Lobster NewYork"
# 
# [[3]]
# [1] "Red Lobster" "NewYork"    

# Paste the bits together with paste(..., collapse=' ')
sapply(str_extract_all(x, '[a-zA-Z]+(?: +[a-zA-Z]+)*\\b'), paste, collapse=' ')
# [1] "RED LOBSTER"          "Red Lobster NewYork" "Red Lobster NewYork"
于 2013-04-03T05:09:34.280 回答
2

使用strsplit和的组合grepl

 sapply(strsplit(x, ' '), function(x) paste(x[!grepl('[[:digit:]]',x)], collapse = ' '))

这按空格分割,然后测试是否有数字分割向量,并且只将没有数字的粘贴在一起。

于 2013-04-03T05:02:15.273 回答
0

替代gsub版本:

x <- c("RED LOBSTER CA04606","Red Lobster NewYork WY245")

gsub("(.+)\\s+(.+$)","\\1",x)
[1] "RED LOBSTER"         "Red Lobster NewYork"

并获取文本的另一部分:

gsub("(.+)\\s+(.+$)","\\2",x)
[1] "CA04606" "WY245"  
于 2013-04-03T05:10:34.583 回答
0

这是一步一步

mystr<-"Red Lobster NewYork WY245"
r<-regexpr("[A-Z][A-Z][0-9]+", mystr)
s<-substr(mystr, r[1], r[1] + attr(r, "match.length"))
mystr<-sub(s, "", mystr)
于 2013-04-03T05:25:01.370 回答