Mendapatkan dan menghapus karakter pertama dari sebuah string

102

Saya ingin melakukan jalan-jalan 2 dimensi menggunakan string karakter dengan menetapkan nilai yang berbeda untuk setiap karakter. Saya berencana untuk 'meletuskan' karakter pertama dari sebuah string, menggunakannya, dan mengulanginya untuk sisa string.

Bagaimana saya bisa mencapai sesuatu seperti ini?

x <- 'hello stackoverflow'

Saya ingin bisa melakukan sesuatu seperti ini:

a <- x.pop[1]

print(a)

'h'
print(x)

'ello stackoverflow'
pedrosaurio
sumber

Jawaban:

167

Lihat ?substring.

x <- 'hello stackoverflow'
substring(x, 1, 1)
## [1] "h"
substring(x, 2)
## [1] "ello stackoverflow"

Gagasan memiliki popmetode yang mengembalikan nilai dan memiliki efek samping memperbarui data yang disimpan xsangat banyak merupakan konsep dari pemrograman berorientasi objek. Jadi daripada mendefinisikan popfungsi untuk beroperasi pada vektor karakter, kita bisa membuat kelas referensi dengan popmetode.

PopStringFactory <- setRefClass(
  "PopString",
  fields = list(
    x = "character"  
  ),
  methods = list(
    initialize = function(x)
    {
      x <<- x
    },
    pop = function(n = 1)
    {
      if(nchar(x) == 0)
      {
        warning("Nothing to pop.")
        return("")
      }
      first <- substring(x, 1, n)
      x <<- substring(x, n + 1)
      first
    }
  )
)

x <- PopStringFactory$new("hello stackoverflow")
x
## Reference class object of class "PopString"
## Field "x":
## [1] "hello stackoverflow"
replicate(nchar(x$x), x$pop())
## [1] "h" "e" "l" "l" "o" " " "s" "t" "a" "c" "k" "o" "v" "e" "r" "f" "l" "o" "w"
Richie Cotton
sumber
15

Ada juga str_subdari paket stringr

x <- 'hello stackoverflow'
str_sub(x, 2) # or
str_sub(x, 2, str_length(x))
[1] "ello stackoverflow"
Tony Ladson
sumber
10

Gunakan fungsi ini dari stringipaket

> x <- 'hello stackoverflow'
> stri_sub(x,2)
[1] "ello stackoverflow"
bartektartanus
sumber
8

substringsudah pasti yang terbaik, tapi inilah satu strsplitalternatif, karena saya belum melihatnya.

> x <- 'hello stackoverflow'
> strsplit(x, '')[[1]][1]
## [1] "h"

atau setara

> unlist(strsplit(x, ''))[1]
## [1] "h"

Dan Anda bisa pastemenyatukan sisa benang.

> paste0(strsplit(x, '')[[1]][-1], collapse = '')
## [1] "ello stackoverflow"
Rich Scriven
sumber
5

menghapus karakter pertama:

x <- 'hello stackoverflow'
substring(x, 2, nchar(x))

Ide adalah memilih semua karakter mulai dari 2 hingga jumlah karakter dalam x. Ini penting ketika Anda memiliki jumlah karakter yang tidak sama dalam kata atau frase.

Memilih huruf pertama itu sepele seperti jawaban sebelumnya:

substring(x,1,1)
jon
sumber
2

Alternatif lain adalah menggunakan sub-ekspresi menangkap dengan fungsi ekspresi reguler regmatchesdan regexec.

# the original example
x <- 'hello stackoverflow'

# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', x))

Ini mengembalikan seluruh string, karakter pertama, dan hasil "muncul" dalam daftar panjang 1.

myStrings
[[1]]
[1] "hello stackoverflow" "h"                   "ello stackoverflow" 

yang setara dengan list(c(x, substr(x, 1, 1), substr(x, 2, nchar(x)))). Artinya, ini berisi himpunan super dari elemen yang diinginkan serta string lengkap.


Menambahkan sapplyakan memungkinkan metode ini berfungsi untuk vektor karakter dengan panjang> 1.

# a slightly more interesting example
xx <- c('hello stackoverflow', 'right back', 'at yah')

# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', xx))

Ini mengembalikan daftar dengan string lengkap yang cocok sebagai elemen pertama dan subekspresi yang cocok ditangkap ()sebagai elemen berikut. Jadi dalam ekspresi reguler '(^.)(.*)', (^.)cocokkan karakter pertama dan (.*)cocok dengan karakter yang tersisa.

myStrings
[[1]]
[1] "hello stackoverflow" "h"                   "ello stackoverflow" 

[[2]]
[1] "right back" "r"          "ight back" 

[[3]]
[1] "at yah" "a"      "t yah" 

Sekarang, kita dapat menggunakan metode sapply+ terpercaya [untuk menarik substring yang diinginkan.

myFirstStrings <- sapply(myStrings, "[", 2)
myFirstStrings
[1] "h" "r" "a"
mySecondStrings <- sapply(myStrings, "[", 3)
mySecondStrings
[1] "ello stackoverflow" "ight back"          "t yah"
lmo
sumber
Ini adalah trik yang sangat bagus tapi saya pikir itu meleset dari pertanyaannya.
pedrosaurio
Anda harus menjelaskan lebih lanjut karena dapat menghasilkan keluaran yang sama dengan jawaban lainnya. Lihat blok terakhir kode yang digunakan sapplyuntuk ekstraksi. "meletuskan" karakter pertama, sebagaimana ditentukan dalam pertanyaan, adalah masalah mengulangi proses ini pada vektor yang dihasilkan (mySecondStrings).
lmo
Tentu itu berfungsi dengan penjelasan tambahan yang baru saja Anda tambahkan tetapi saya masih merasa itu lebih berbelit-belit dari yang seharusnya.
pedrosaurio