Jak mogę uzyskać ostatnie n znaków z ciągu w R? Czy istnieje funkcja taka jak PRAWO SQL?
271
Nic mi nie wiadomo w bazie R, ale łatwo jest zrobić funkcję za pomocą substr
i nchar
:
x <- "some text in a string"
substrRight <- function(x, n){
substr(x, nchar(x)-n+1, nchar(x))
}
substrRight(x, 6)
[1] "string"
substrRight(x, 8)
[1] "a string"
Jest to wektoryzowane, jak wskazuje @mdsumner. Rozważać:
x <- c("some text in a string", "I really need to learn how to count")
substrRight(x, 6)
[1] "string" " count"
nchar(x)
dwukrotnego wywołania poprzez przypisanie go do zmiennej lokalnej?Jeśli nie masz nic przeciwko korzystaniu z
stringr
pakietu,str_sub
jest to przydatne, ponieważ możesz użyć negatywów do liczenia wstecz:Lub, jak wskazuje Max w komentarzu do tej odpowiedzi,
źródło
stringr
że został przerobionystringi
na backend, więc powinien działać teraz z NA itp.Użyj
stri_sub
funkcji zstringi
pakietu. Aby uzyskać podciąg od końca, użyj liczb ujemnych. Przykłady poniżej:Możesz zainstalować ten pakiet z github: https://github.com/Rexamine/stringi
Jest już dostępny w CRAN, po prostu wpisz
aby zainstalować ten pakiet.
źródło
źródło
Innym dość prostym sposobem jest użycie wyrażeń regularnych i
sub
:Tak więc „pozbyć się wszystkiego, a następnie jednej postaci”. Aby złapać więcej postaci od końca, dodaj jednak tyle kropek w twierdzeniu lookahead:
gdzie
.{2}
oznacza..
, lub „dowolne dwa znaki”, co oznacza „pozbądź się wszystkiego, a po nim dwa znaki”.dla trzech znaków itp. Możesz ustawić liczbę znaków, które mają być pobierane za pomocą zmiennej, ale musisz wprowadzić
paste
wartość zmiennej do ciągu wyrażenia regularnego:źródło
regmatches(x, regexpr(".{6}$", x))
AKTUALIZACJA : jak zauważył mdsumner , oryginalny kod jest już wektoryzowany, ponieważ substr jest. Powinien być bardziej ostrożny.
A jeśli chcesz wersję wektorową (na podstawie kodu Andrie )
Zauważ, że zmieniłem
(nchar(x)-n)
na,(nchar(x)-n+1)
aby zdobyćn
postacie.źródło
(nchar(x)-n)
do(nchar(x)-n+1)
”Proste podstawowe rozwiązanie R wykorzystujące
substring()
funkcję (kto wiedział, że ta funkcja w ogóle istniała?):Zaletą tego jest to, że
substr()
znajduje się on poniżej, ale ma domyślną wartość końcową 1 000 000.Przykłady:
źródło
Alternatywą
substr
jest podzielenie łańcucha na listę pojedynczych znaków i przetworzenie, które:źródło
Ja
substr
też używam , ale w inny sposób. Chcę wyodrębnić 6 ostatnich znaków „Daj mi swoje jedzenie”. Oto kroki:(1) Podziel znaki
(2) Wyodrębnij ostatnie 6 znaków
Wynik:
Dostęp do każdej postaci można uzyskać
splits[[1]][x]
, gdzie x wynosi od 1 do 6.źródło
ktoś wcześniej używał podobnego rozwiązania do mojego, ale łatwiej mi myśleć, jak poniżej:
Spowoduje to, że ostatnie postacie będą według potrzeb.
źródło
Spróbuj tego:
To powinno dać:
źródło
Użyłem następującego kodu, aby uzyskać ostatni znak ciągu.
Możesz grać z nchar (stringOfInterest), aby dowiedzieć się, jak zdobyć kilka ostatnich znaków.
źródło
Mała modyfikacja rozwiązania @Andrie daje również uzupełnienie:
Tego właśnie szukałem. I zaprasza po lewej stronie:
źródło
Na wszelki wypadek, gdy trzeba wybrać zakres znaków:
źródło