Jak usunąć ostatnie n znaków z każdego elementu w wektorze R.


106

Jestem bardzo nowy w R i nie mogłem znaleźć prostego przykładu online, jak usunąć ostatnie n znaków z każdego elementu wektora (tablicy?)

Pochodzę z języka Java, więc chciałbym zrobić iterację po każdym elemencie a$datai usunąć ostatnie 3 znaki z każdego elementu.

Jak byś się do tego zabrał?

Odpowiedzi:


115

Oto przykład tego, co bym zrobił. Mam nadzieję, że tego właśnie szukasz.

char_array = c("foo_bar","bar_foo","apple","beer")
a = data.frame("data"=char_array,"data2"=1:4)
a$data = substr(a$data,1,nchar(a$data)-3)

a powinien teraz zawierać:

  data data2
1 foo_ 1
2 bar_ 2
3   ap 3
4    b 4

Zabawne, musiałem zmienić -3aby -0uzyskać pożądany efekt! Mam dużo danych z datami, np .: "2014-03-27 23:00:00 GMT" "2014-03-31 00:00:00 BST"- tak, dwie strefy czasowe razem, a funkcja as.Date zwraca nieoczekiwane wyniki (dzień wcześniej dla dat BST) - dlatego chciałem usunąć znacznik strefy czasowej, okazuje się, że muszę zrobić -0i znika wraz z godzinami
LucasSeveryn

Weź również pod uwagę funkcję strptime, chociaż wcześniej nie korzystałem ze stref czasowych. Myślę, że może to rozpoznać. Podobno „% Z” rozpoznaje strefy czasowe. Usunąłem również funkcję sapply. Zapomniałem, jak bardzo R lubi wektoryzować swoje funkcje.
nfmcclure

@LucasSeveryn Jeśli chcesz przekonwertować reprezentacje czasu znaków na daty uwzględniające strefy czasowe, edytuj to w swoim pytaniu. Prawdopodobnie istnieją lepsze odpowiedzi, które doprowadzą Cię bezpośrednio do pożądanych wyników (takich jak strptime).
Blue Magister

84

Oto sposób na gsub:

cs <- c("foo_bar","bar_foo","apple","beer")
gsub('.{3}$', '', cs)
# [1] "foo_" "bar_" "ap"   "b"

4
(+1) Wielki fan regex. Można go używać na prawie wszystkim.
Rich Scriven

8
Uwaga: Zwraca oryginalny ciąg, jeśli jest dłuższy niż liczba znaków do wycięcia. Rozważ gsub('.{5}$', '', 'abcd').
Tomas Greif

32

Chociaż jest to w większości to samo z odpowiedzią @nfmcclure, wolę używać stringrpakietu, ponieważ zapewnia zestaw funkcji, których nazwy są najbardziej spójne i opisowe niż te w podstawowym R (w rzeczywistości zawsze wyszukuję w wyszukiwarce „jak uzyskać liczbę znaki w R ”, bo nazwy nie pamiętam nchar()).

library(stringr)
str_sub(iris$Species, end=-4)
#or 
str_sub(iris$Species, 1, str_length(iris$Species)-3)

Spowoduje to usunięcie ostatnich 3 znaków z każdej wartości w Specieskolumnie.


22
z stringrpakietem jest jeszcze prostsze rozwiązanie: str_sub(iris$Species, end=-4)
jan-glx

14

To samo można osiągnąć z pakietem stringi :

library('stringi')
char_array <- c("foo_bar","bar_foo","apple","beer")
a <- data.frame("data"=char_array, "data2"=1:4)
(a$data <- stri_sub(a$data, 1, -4)) # from the first to the last but 4th char
## [1] "foo_" "bar_" "ap"   "b" 

3

Podobne do @Matthew_Plourde using gsub

Jednak używając wzorca, który obetnie do zera znaków, tj. Zwróci „”, jeśli oryginalny ciąg jest krótszy niż liczba znaków do wycięcia:

cs <- c("foo_bar","bar_foo","apple","beer","so","a")
gsub('.{0,3}$', '', cs)
# [1] "foo_" "bar_" "ap"   "b"    ""    ""

Różnica polega na tym, że {0,3}kwantyfikator wskazuje od 0 do 3 dopasowań, podczas gdy {3}wymaga dokładnie 3 dopasowań, w przeciwnym razie żadne dopasowanie nie zostanie znalezione, w takim przypadku gsubzwraca oryginalny, niezmodyfikowany ciąg.

Uwaga: użycie {,3}byłoby równoważne {0,3}, po prostu wolę ten drugi zapis.

Więcej informacji na temat kwantyfikatorów wyrażeń regularnych można znaleźć tutaj: https://www.regular-expressions.info/refrepeat.html


Możesz użyć sub()zamiast gsub().
sindri_baldur
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.