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.