Отримання та видалення першого символу рядка


102

Я хотів би зробити кілька двовимірних прогулянок з використанням рядків символів, призначивши різні значення кожному символу. Я планував 'вискакувати' перший символ рядка, використовувати його та повторити для решти рядка.

Як я можу досягти чогось подібного?

x <- 'hello stackoverflow'

Я хотів би мати можливість зробити щось подібне:

a <- x.pop[1]

print(a)

'h'
print(x)

'ello stackoverflow'

Відповіді:


167

Див ?substring.

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

Ідея наявності popметоду, який і повертає значення, і має побічний ефект від оновлення даних, що зберігаються, x- це дуже концепція об'єктно-орієнтованого програмування. Таким чином , замість того , щоб визначати popфункції для роботи над векторами символів, ми можемо зробити еталонний клас з popметодом.

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"

15

Є також str_subз пакета stringr

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


8

substringБезумовно, найкраще, але ось одна з strsplitальтернатив, оскільки я її ще не бачив.

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

або рівнозначно

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

А ви можете pasteзалишити рядок назад разом.

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

5

видалення перших символів:

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

Ідеєю є вибір усіх символів, починаючи від 2 до кількості символів у х. Це важливо, коли у вас є неоднакова кількість символів у слові чи фразі.

Вибір першого листа тривіальний як попередні відповіді:

substring(x,1,1)

2

Іншою альтернативою є використання захоплення підвиразів за допомогою функцій регулярного вираження regmatchesта regexec.

# the original example
x <- 'hello stackoverflow'

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

При цьому повертається весь рядок, перший символ та результат "спливаючого" у списку довжиною 1.

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

що еквівалентно list(c(x, substr(x, 1, 1), substr(x, 2, nchar(x)))). Тобто, він містить супер набір бажаних елементів, а також повний рядок.


Додавання sapplyдозволить цьому методу працювати для символьного вектора довжиною> 1.

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

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

Це повертає список із відповідним повним рядком як першим елементом та відповідними піддепресіями, захопленими ()наступними елементами. Таким чином , в регулярному виразі '(^.)(.*)', (^.)відповідає першому символу і (.*)відповідає залишилися символи.

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

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

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

Тепер ми можемо використовувати метод Trusty sapply+, [щоб витягнути потрібні підрядки.

myFirstStrings <- sapply(myStrings, "[", 2)
myFirstStrings
[1] "h" "r" "a"
mySecondStrings <- sapply(myStrings, "[", 3)
mySecondStrings
[1] "ello stackoverflow" "ight back"          "t yah"

Це дуже приємний трюк, але я думаю, що це питання не вистачає.
pedrosaurio

Вам потрібно буде пояснити далі, оскільки це може дати той же результат, що й інші відповіді. Дивіться заключний блок коду, який використовується sapplyдля вилучення. "вискакує" перший символ, як зазначено в питанні, є питанням повторення цього процесу на отриманому векторі (mySecondStrings).
lmo

Звичайно, він працює з додатковим поясненням, яке ви тільки що додали, але я все-таки вважаю його складнішим, ніж слід.
pedrosaurio
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.