文字列の最初の文字を取得して削除する


102

各文字に異なる値を割り当てることにより、文字列を使用していくつかの2次元ウォークを実行したいと思います。文字列の最初の文字を「ポップ」し、それを使用して、残りの文字列について繰り返します。

どうすればこのようなことを達成できますか?

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ストリンガーパッケージもあります

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

10

stringiパッケージからこの関数を使用する

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

8

substring間違いなく最高ですがstrsplit、まだ見たことがないので、ここに1つの選択肢があります。

> 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からxの文字数までのすべての文字を選択することです。これは、単語またはフレーズの文字数が等しくない場合に重要です。

以前の回答と同じように、最初の文字を選択するのは簡単です。

substring(x,1,1)

2

もう1つの方法は、正規表現関数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 2017年

他の回答と同じ出力を生成できるため、さらに説明する必要があります。sapply抽出に使用するコードの最後のブロックを参照してください。質問で指定されているように、最初の文字を「ポップ」することは、結果のベクター(mySecondStrings)でこのプロセスを繰り返すことです。
lmo 2017年

確かに、あなたが追加した追加の説明で機能しますが、それでも、必要以上に複雑になっています。
pedrosaurio 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.