Tronquer la fin d'une chaîne dans la R d'après un personnage qui peut être présent zéro ou plusieurs fois
J'ai les données suivantes:
temp<-c("AIR BAGS:FRONTAL" ,"SERVICE BRAKES HYDRAULIC:ANTILOCK",
"PARKING BRAKE:CONVENTIONAL",
"SEATS:FRONT ASSEMBLY:POWER ADJUST",
"POWER TRAIN:AUTOMATIC TRANSMISSION",
"SUSPENSION",
"ENGINE AND ENGINE COOLING:ENGINE",
"SERVICE BRAKES HYDRAULIC:ANTILOCK",
"SUSPENSION:FRONT",
"ENGINE AND ENGINE COOLING:ENGINE",
"VISIBILITY:WINDSHIELD WIPER/WASHER:LINKAGES")
Je voudrais créer un nouveau vecteur qui permet de conserver uniquement le texte avant le premier ":" dans le cas où un":", et le mot en entier quand ":" n'est pas présent.
J'ai essayé d'utiliser:
temp=data.frame(matrix(unlist(str_split(temp,pattern=":",n=2)),
+ ncol=2, byrow=TRUE))
mais il ne fonctionne pas dans les cas où il n'y a pas de ":"
Je sais que cette question est très similaire à:
tronquer chaîne à partir d'un certain caractère dans R, qui a utilisé:
sub("^[^.]*", "", x)
Mais je ne suis pas très familier avec les expressions régulières ont eu de la peine pour inverser cette exemple pour ne retenir que le début de la chaîne.
OriginalL'auteur Tony M. | 2012-06-04
Vous devez vous connecter pour publier un commentaire.
Vous pouvez résoudre ce problème avec une simple regex:
Comment les regex fonctionne:
"(.*?):.*"
Recherchez un répétée ensemble de tous les caractères.*
mais le modifier avec?
de ne pas être gourmand. Cela devrait être suivi par un deux-points, puis n'importe quel caractère (répété)"\\1"
Le bit à comprendre, c'est que toute correspondance de la regex est gourmand par défaut. En le modifiant à être non-gourmand, le motif ne peut pas inclure le côlon, depuis le premier caractère après entre parenthèses est un colon. La regex après les deux points est de retour à la valeur par défaut, c'est à dire gourmand.
OriginalL'auteur Andrie
Une autre approche est de regarder pour la première de ":" et de le remplacer et n'importe quoi après avec rien:
Si aucun ":" est trouvé, alors rien n'est substituée et vous obtenez l'ensemble de la chaîne d'origine. Si il y a un ":" le premier est appariés le long avec tout ce qui est après elle, c'est remplacer par rien ("") qui l'efface et laisse tout en place pour que le premier colon.
OriginalL'auteur Greg Snow
Fait ce travail (en supposant que vos données sont dans un personnage vectoriel):
C'était ma pensée parce que je n'ai pas vraiment de "penser" dans la regex, mais je n'avais pas de grands espoirs pour la vitesse.
OriginalL'auteur joran
désolé pour ajouter cela comme une réponse. En réponse à des temps de prise:
Les regex sont à peu près équivalentes les strsplit prend un peu plus
OriginalL'auteur shhhhimhuntingrabbits
dans ce cas
peut travailler pour vous
OriginalL'auteur shhhhimhuntingrabbits