从字符串中删除最后一个单词。

16

我正在尝试做某件事情,但是无法记住/找到答案。我有一个来自人口普查局的城市名称列表,他们在末尾放置了城市类型,这会破坏我的match()

我想要做到这一点:

Middletown Township
Sunny Valley Borough
Hillside Village

转换成这个:

Middletown
Sunny Valley
Hillside

有什么建议吗?最好能知道R中是否有lastIndexOf()函数。

以下是数据:

df1 <- data.frame(
  id = c(1, 2, 3),
  city = factor(c("Middletown Township", "Sunny Valley Borough", "Hillside Village"))
)
3个回答

22

这将有效:

gsub("\\s*\\w*$", "", df1$city)
[1] "Middletown"   "Sunny Valley" "Hillside"   

它会移除任何由一个或多个空格字符组成的子字符串,后面是任意数量的“单词”字符(空格、数字或下划线),并且紧接着字符串结束。


1
如果我想获取“Township,Borough,Village”即最后一个单词,并将其保存为新变量,该怎么办? - jacob
1
你可以使用stringi包。函数名是stri_extract_last_words。您可以向此函数提供一个句子列表,它将返回这些句子中最后一个单词的列表。但是,它不会从句子中删除最后一个单词,为了删除目的,我们需要由Josh提供的gsub命令。 - rkmalaiya

18

这是一个正则表达式,可以满足你的需求:

sub(df1$city, pattern = " [[:alpha:]]*$", replacement = "")

[1] "Middletown" "Sunny Valley" "Hillside"

这段代码是将以空格开头且仅包含字母的子字符串替换为空字符串。


+1,这个正则表达式更好,因为它会保留单词。 - topchef

6
我会在stringr包中使用word()函数,如下所示:
df1 %>% mutate(city = word(city , 1  , -2))

第一个参数 (1) 表示你从第一词开始,第二个参数 (-2) 表示你保留除了最后两个单词之外的所有内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接