2016-05-27 12 views
5

Próbuję pozbyć się wszystkich liczb/znaków nadchodzących PO PIERWSZYM łączniku. oto kilka przykładów:Zapisuj tylko cyfry przed pierwszym łącznikiem ORAZ w łączniku

15-103025-01 
800-40170-02 
68-4974-01 

My pożądane wyjście:

15- 
800- 
68- 

Czytałem poprzez stanowiska takie jak:

  1. Using gsub to extract character string before white space in R
  2. truncate string from a certain character in R
  3. Truncating the end of a string in R after a character that can be present zero or more times

Ale nie są one tym, czego szukam, ponieważ metody wspomniane w tych pozbędą się również mojego łącznika (pozostawiając mi tylko pierwsze 2 lub 3 cyfry).

Oto, co starałem dotąd:

gsub(pattern = '[0-9]*-$', replacement = "", x = data$id) 
grep(pattern = '[0-9]*-', replacement = "", x = data$id) 
regexpr(pattern = '[0-9]*-', text = data$id) 

ale naprawdę nie działa, jak się spodziewałem.

+2

Jak o 'sub ("(<= -?). *"," ", x, perl = TRUE)', używając 'sub()' dla pierwszego wystąpienia '-',' (? <= -) 'dla pozytywnego lookbehind, aby zachować' -' i '. *' do usuń wszystko po nim. –

+0

Witam @RichardScriven, możesz wyjaśnić nieco więcej, co oznacza każdy z komponentów? jak "(? <= -). *"? – alwaysaskingquestions

+0

Odśwież, aby zobaczyć mój zaktualizowany mój komentarz –

Odpowiedz

6

Kilka sposobów, aby to osiągnąć, tutaj jest jeden:

have <- c("15-103025-01", "800-40170-02", "68-4974-01") 
want <- sub(pattern = "(^\\d+\\-).*", replacement = "\\1", x = have) 

Więc w wyrażeniu regularnym, będziesz miał jedną grupę utworzoną z () „s, która dopasowuje początek napisu (^), a następnie przez jedną lub więcej liczb (\\d+) i łącznika (\\-). Poza grupą jest każda inna postać (następne), które następnie (.*).

W części zamiennej określamy \\1, aby odnieść się do pierwszej (i jedynej) grupy wyrażenia regularnego. Nie dodawanie niczego innego oznacza upuszczenie całej reszty.

+0

cześć, dziękuję za pomoc! czy możesz wyjaśnić nieco więcej "(^ \\ d + \\ -). *" i "\\ 1"? – alwaysaskingquestions

+0

Nie ma za co. pls zobacz moją edycję odpowiedzi na twoje pytania. –

2

alternatywna z stringr, podobno nazwa wektora jest x

library(stringr) 
str_sub(x,1,str_locate(x,"-")[ ,1]) 

ta część zajmuje jako wektor argumentów ciągów pozycję zwroty dopasowane wzorzec w tym przypadku „-” w ciągu

str_locate(x,"-") 

Tak więc ten kod zwróci macierz pozycji początkowej i końcowej, które w tym przypadku są tymi samymi numerami, ponieważ "-" to tylko jeden znak rozpoczynający się i kończący w tej samej pozycji

 start end 
[1,]  3 3 
[2,]  4 4 
[3,]  3 3 

Kiedy podzbiór ten sposób

str_locate(x,"-")[ ,1] 

otrzymujemy

[1] 3 4 3 

i teraz funkcjonować str_sub pobiera podciąg całego łańcucha gdzie określamy miejsce rozpoczęcia i zakończenia fragmentu. W zasadzie oznacza to, że wszystkie elementy wektora x tworzą podciągi zaczynające się od znaku 1 i kończą w miejscu pierwszego myślnika, który jest obliczany jak pokazano wcześniej.

str_sub(x,1,str_locate(x,"-")[ ,1]) 
+0

cześć Tomas, dziękuję za pomoc! zastanawiałeś się, czy mógłbyś wyjaśnić nieco więcej argumentów, które włożyłeś? na przykład, jakie są dwa "1" w swoim kodzie? i czy ta skala umożliwia zlokalizowanie drugiego łącznika? – alwaysaskingquestions

+0

Cześć, zredagowałem odpowiedź, aby to wyjaśnić. O drugim łączniku, na pewno wszystko można zrobić. Ale nie wiem, czy chcesz ciąg od początku do drugiego myślnika lub numerów od pierwszego myślnika do drugiego myślnika –

+0

po przeczytaniu wyjaśnień, myślę, że rozumiem go teraz znacznie lepiej i myślę, że mogę skalować go, aby zrobić 1. myślnik do drugiego skoku sam. Dziękuję bardzo! – alwaysaskingquestions

3

Dlaczego nie wystarczy,

sub('-.*', '-', x) 
#[1] "15-" "800-" "68-" 

Aby zrobić to samo z drugim łącznikiem następnie,

sub('-([^-]*)$', '-', x) 
#[1] "15-103025-" "800-40170-" "68-4974-" 
+0

i to zagwarantuje Ci znalezienie pierwszego łącznika ?? – alwaysaskingquestions

+0

@alwaysasking pytania, tak. Zastąpi wszystko po pierwszym łączniku tylko łącznikiem. – Sotos

+0

jest to bardzo sprytny sposób na zrobienie tego ... co jeśli chcę znaleźć drugi łącznik? – alwaysaskingquestions

Powiązane problemy