从字符串中删除特定元素

3

我有一个由向量组成的向量

data<-c("Mark And (BD Marketing Da 1 Z _ 9793)",
"Andre All (BD Marketing DA 1 Z _ 9794 (plus))", 
"Alli Inn (BD Sport Educ 1 C _ 9722 (plus))",
"Alli Inn (BP Sport Educ 1 Z _ 9347)")

现在我需要删除_之前的所有字符,并且删除括号(如果缺少单词(plus))。因此,结果应该是:

Mark And BD Marketing Da 1 Z
Andre All BD Marketing DA 1 Z (plus)
Alli Inn BD Sport Educ 1 C (plus)
Alli Inn BP Sport Educ 1 Z

我使用gsub("\\s*\\w*$", "", data)并获得了以下结果

Alli Inn (BP Sport Educ 1 Z

但这不正确,因为我需要删除其他括号,并保留写在 (plus) 中的内容。
我已经尝试过这个代码: gsub('\((?!plus)|(?<!plus)\)|.\\d+', '', rownames(data), perl=TRUE),得到了这个结果: Alli Inn BP Sport Educ Z,但现在我错过了字母前的数字1

1
将来参考,您拥有的是一个向量,而不是数据框。数据框_包含_一个或多个向量。 - Hong Ooi
2个回答

1
gsub('\\((?!plus)|(?<!plus)\\)|_ [0-9]*', '', data, perl=TRUE)
#[1] "Mark And BD Marketing Da 1 Z "        
#[2] "Andre All BD Marketing DA 1 Z  (plus)"
#[3] "Alli Inn BD Sport Educ 1 C  (plus)"   
#[4] "Alli Inn BP Sport Educ 1 Z " 

如果我这样做,仍然会有像这样的数字:Mark And BD Marketing Da 1 Z 9793,我认为我应该改变 _ [0-9] 中的某些内容,以便也可以删除数字? - Miha
我尝试过这个代码:'gsub('\((?!plus)|(?<!plus)\)|.\d+', '', rownames(data), perl=TRUE)',得到了这个结果:'Alli Inn BP Sport Educ Z',但现在我缺少字母前的数字1。 - Miha
我认为情况是这样的。问题在于代码太长无法展示,我使用了以下代码将数据向量从数据框中组合起来,并使用rownames(data)<-paste0(sapply(data.average[rownames(data),"NAME"]), " (", data.average[rownames(data),"ID"], ")")将行名赋值,这两列组合后的结构是“字符型”。因此,我在原始帖子中的数据是由代码rownames(data)....所构成的。 - Miha
你想让我说什么?你给了我这个 "Alli Inn (BP Sport Educ 1 Z _ 9347)" ,我给了你这个 "Alli Inn BP Sport Educ 1 Z" 。现在你说当你运行它时,它不起作用。我正在向你展示它可以工作。如果你有另一个不能工作的例子,那就把那个例子发布到问题中,我们来尝试一下。 - Pierre L
是的,它可以工作。之前我的代码有一个错误,因此无法正常工作。谢谢。 - Miha
显示剩余2条评论

1
使用dplyr和stringr可能会很快而简单,但它能完成任务。
library(dplyr)
library(stringr)
data %>% 
  str_replace_all(" _ [1-9][0-9]{0,3}|\\(|\\)", "") %>% 
  str_replace_all("plus", "(plus)")

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