R vektöründeki her öğeden son n karakter nasıl kaldırılır


107

R konusunda çok yeniyim ve bir vektörün (dizi?) Her öğesinden son n karakterin nasıl kaldırılacağına dair basit bir çevrimiçi örnek bulamadım.

Ben bir Java geçmişinden geliyorum, bu yüzden yapmak istediğim şey, her bir öğeyi yinelemek ve her öğeden a$datason 3 karakteri kaldırmaktır.

Nasıl devam edersin?

Yanıtlar:


116

İşte yapacağım şeyin bir örneği. Umarım aradığınız budur.

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 şimdi şunları içermelidir:

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

Tuhaf bir şekilde, istenen efekti elde -3etmek -0için değiştirmem gerekiyordu ! Tarihlerle ilgili pek çok "2014-03-27 23:00:00 GMT" "2014-03-31 00:00:00 BST"verim var , örneğin: - evet, iki saat dilimi birlikte ve as.Date işlevi beklenmedik sonuçlar veriyor (BST tarihleri ​​için gün erken) - bu nedenle saat dilimi damgasını kaldırmak istedim, sonuçta mecburum yap -0ve
saatlerle

Ayrıca strptime işlevini de göz önünde bulundurun, daha önce saat dilimlerini kullanmadım. Sanırım tanıyabilir. Sözde "% Z" saat dilimlerini tanıyor. Ayrıca sapply işlevini de kaldırdım. R'nin işlevlerini vektörleştirmeyi ne kadar sevdiğini unutmuşum.
nfmcclure

@LucasSeveryn Karakter zaman temsillerini, saat dilimlerini hesaba katarak tarihlere dönüştürmek istiyorsanız, lütfen bunu sorunuza dönüştürün. Muhtemelen sizi doğrudan istediğiniz sonuçlara götürecek daha iyi yanıtlar vardır (örneğin strptime).
Mavi Magister

85

İşte bunun bir yolu gsub:

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

4
(+1) Büyük regex hayranı. Hemen hemen her şeyde kullanılabilir.
Rich Scriven

8
Not: Bu, kesilecek karakter sayısından daha uzunsa orijinal dizeyi döndürür. Düşünün gsub('.{5}$', '', 'abcd').
Tomas Greif

32

Bu çoğunlukla @nfmcclure tarafından verilen yanıtla aynı olsa da, stringrR tabanındakilerden daha tutarlı ve açıklayıcı isimleri olan bir dizi işlevi sağladığından paketi kullanmayı tercih ederim (aslında her zaman " adı hatırlayamadığım için R "harfindeki karakterlernchar() ).

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

Bu, Speciessütundaki her değerden son 3 karakteri kaldırır .


22
ile stringrpaketin daha basit bir çözüm yoktur: str_sub(iris$Species, end=-4)
Ocak-glx

14

Aynı şey stringi paketiyle de elde edilebilir :

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

@Matthew_Plourde ile benzer gsub

Ancak, sıfır karaktere kırpılacak bir desen kullanmak, yani orijinal dize kesilecek karakter sayısından daha kısaysa "" döndürmek :

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

Aradaki fark, {0,3}nicelik belirtecinin 0 ila 3 eşleşmeyi göstermesidir, oysa {3}tam olarak 3 eşleşme gerektirir , aksi takdirde eşleşme bulunmaz, bu durumda gsuborijinal, değiştirilmemiş dizeyi döndürür.

NB kullanmak {,3}eşdeğer olacaktır {0,3}, ben sadece ikinci gösterimi tercih ederim.

Normal ifade miktar belirleyicileri hakkında daha fazla bilgi için buraya bakın: https://www.regular-expressions.info/refrepeat.html


Bunun sub()yerine kullanabilirsiniz gsub().
sindri_baldur
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.