Bagaimana menghapus karakter n terakhir dari setiap elemen dalam vektor R.

106

Saya sangat baru mengenal R, dan saya tidak dapat menemukan contoh sederhana secara online tentang cara menghapus karakter n terakhir dari setiap elemen vektor (array?)

Saya berasal dari latar belakang Java, jadi yang ingin saya lakukan adalah mengulang setiap elemen a$datadan menghapus 3 karakter terakhir dari setiap elemen.

Bagaimana Anda melakukannya?

LucasSeveryn
sumber

Jawaban:

115

Ini adalah contoh dari apa yang akan saya lakukan. Saya harap itu yang Anda cari.

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 sekarang harus berisi:

  data data2
1 foo_ 1
2 bar_ 2
3   ap 3
4    b 4
nfmcclure
sumber
Dgn aneh, saya harus berubah -3untuk -0mendapatkan efek yang diinginkan! Saya punya banyak data dengan tanggal, seperti: "2014-03-27 23:00:00 GMT" "2014-03-31 00:00:00 BST"- ya, dua zona waktu bersama-sama, dan fungsi as.Date mengembalikan hasil yang tidak terduga (hari sebelumnya untuk tanggal BST) - oleh karena itu saya ingin menghapus cap zona waktu, ternyata saya harus lakukan -0dan menghilang, bersama dengan jam
LucasSeveryn
Juga pertimbangkan fungsi strptime, saya belum pernah menggunakan zona waktu sebelumnya. Saya pikir itu mungkin mengenalinya. Seharusnya "% Z" mengenali zona waktu. Saya juga menghapus fungsi sapply. Saya lupa betapa R suka memvektorisasi fungsinya.
nfmcclure
@LucasSeveryn Jika Anda ingin mengubah representasi waktu karakter menjadi tanggal dengan mempertimbangkan zona waktu, harap edit itu menjadi pertanyaan Anda. Kemungkinan ada jawaban yang lebih baik yang akan membawa Anda langsung ke hasil yang Anda inginkan (seperti strptime).
Magister Biru
84

Berikut caranya dengan gsub:

cs <- c("foo_bar","bar_foo","apple","beer")
gsub('.{3}$', '', cs)
# [1] "foo_" "bar_" "ap"   "b"
Matthew Plourde
sumber
4
(+1) Penggemar regex. Ini dapat digunakan di hampir semua hal.
Rich Scriven
8
Catatan: Ini mengembalikan string asli jika lebih panjang dari jumlah karakter yang akan dipotong. Pertimbangkan gsub('.{5}$', '', 'abcd').
Tomas Greif
32

Meskipun ini sebagian besar sama dengan jawaban oleh @nfmcclure, saya lebih suka menggunakan stringrpaket karena ini menyediakan serangkaian fungsi yang namanya paling konsisten dan deskriptif daripada yang ada di basis R (sebenarnya saya selalu mencari di Google untuk "cara mendapatkan jumlah karakter dalam R " karena saya tidak dapat mengingat namanya nchar()).

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

Ini menghapus 3 karakter terakhir dari setiap nilai di Specieskolom.

Blaszard
sumber
22
dengan stringrpaket ada solusi yang lebih sederhana: str_sub(iris$Species, end=-4)
jan-glx
14

Hal yang sama dapat dicapai dengan paket 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" 
gagolews
sumber
3

Mirip dengan @Matthew_Plourde menggunakan gsub

Namun, menggunakan pola yang akan memotong ke karakter nol yaitu mengembalikan "" jika string asli lebih pendek dari jumlah karakter yang akan dipotong:

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

Perbedaannya adalah, {0,3}pembilang menunjukkan 0 hingga 3 kecocokan, sedangkan {3}membutuhkan tepat 3 kecocokan, jika tidak, tidak ada kecocokan yang ditemukan dalam hal ini gsubmengembalikan string asli yang tidak dimodifikasi.

Penggunaan NB {,3}akan sama dengan {0,3}, saya lebih suka notasi yang terakhir.

Lihat di sini untuk informasi lebih lanjut tentang bilangan regex: https://www.regular-expressions.info/refrepeat.html

krads
sumber
Anda dapat menggunakan sub()sebagai pengganti gsub().
sindri_baldur