web-dev-qa-db-fra.com

Supprimer les parenthèses et le texte à l'intérieur des chaînes dans R

En R, j'ai une liste de sociétés telles que:

companies  <-  data.frame(Name=c("Company A Inc (COMPA)","Company B (BEELINE)", "Company C Inc. (Coco)", "Company D Inc.", "Company E"))

Je veux supprimer le texte entre parenthèses, pour finir avec la liste suivante: 

                  Name
1        Company A Inc 
2            Company B
3       Company C Inc.
4       Company D Inc.
5            Company E

Une approche que j'ai essayée consistait à scinder la chaîne puis à utiliser ldply:

companies$Name <- as.character(companies$Name)
c<-strsplit(companies$Name, "\\(")
ldply(c)

Mais comme tous les noms de société n’ont pas de parenthèses, cela échoue: 

Error in list_to_dataframe(res, attr(.data, "split_labels"), .id, id_as_factor) : 
  Results do not have equal lengths

Je ne suis pas marié à la solution strsplit. Tout ce qui supprime ce texte et les parenthèses serait bien. 

18
aiolias

Un gsub devrait fonctionner ici

gsub("\\s*\\([^\\)]+\\)","",as.character(companies$Name))

# [1] "Company A Inc"  "Company B"      "Company C Inc."
# [4] "Company D Inc." "Company E" 

Ici, nous remplaçons simplement les occurrences de "(...)" par rien (en supprimant également tout espace de début). R donne un aspect pire qu’il ne l’est avec tous les échappements que nous devons faire pour la parenthèse car ce sont des caractères spéciaux dans les expressions régulières.

33
MrFlick

Vous pouvez aussi utiliser:

library(qdap)
companies$Name <-  genX(companies$Name, " (", ")")

companies
        Name
1  Company A Inc
2       CompanyB
3 Company C Inc.
4 Company D Inc.
5       CompanyE
5
akrun

Vous pouvez utiliser stringr::str_replace. C'est bien parce qu'il accepte les variables factorielles.

companies <- data.frame(Name=c("Company A Inc (COMPA)","Company B (BEELINE)", 
                               "Company C Inc. (Coco)", "Company D Inc.", 
                               "Company E"))

library(stringr)
str_replace(companies$Name, " \\(.*\\)", "")
# [1] "Company A Inc"  "Company B"      "Company C Inc." 
# [4] "Company D Inc." "Company E"

Et si vous voulez toujours utiliser strsplit, vous pouvez faire

companies$Name <- as.character(companies$Name)
unlist(strsplit(companies$Name, " \\(.*\\)"))
# [1] "Company A Inc"  "Company B"      "Company C Inc."
# [4] "Company D Inc." "Company E" 
4
Rich Scriven
library(qdap)
bracketX(companies$Name) -> companies$Name
0
Thushara Dulam