Rの文字列から最後のn文字を抽出する


271

Rの文字列から最後のn文字を取得するにはどうすればよいですか?SQLのRIGHTのような関数はありますか?

回答:


283

私はベースRには何も認識していませんが、substrand を使用してこれを行う関数を作成するのは簡単ですnchar

x <- "some text in a string"

substrRight <- function(x, n){
  substr(x, nchar(x)-n+1, nchar(x))
}

substrRight(x, 6)
[1] "string"

substrRight(x, 8)
[1] "a string"

@mdsumnerが指摘するように、これはベクトル化されています。考慮してください:

x <- c("some text in a string", "I really need to learn how to count")
substrRight(x, 6)
[1] "string" " count"

1
stringiパッケージを使用します。NAとすべてのエンコーディングで
正常に動作し

nchar(x)ローカル変数に割り当てることにより、2回の呼び出しを回避する方が効率的ですか?
デイブジャービス

206

stringrパッケージを使用してもかまわない場合str_subは、ネガを使用して逆算できるので便利です。

x <- "some text in a string"
str_sub(x,-6,-1)
[1] "string"

または、マックスがこの回答へのコメントで指摘しているように、

str_sub(x, start= -6)
[1] "string"

32
また、str_sub(x、start = -n)は、最後のn文字を取得します。
最大

2
ストリンガーはNAの値とすべてのエンコーディングではうまく機能しません。stringiパッケージを強くお勧めします:)
bartektartanus 14年

3
私はバックエンドとしてstringr使用stringiして作り直されていたと思うので、今はNAなどで動作するはずです。
m-dz 2016

44

パッケージのstri_sub関数を使用しstringiます。最後から部分文字列を取得するには、負の数を使用します。以下の例をご覧ください。

stri_sub("abcde",1,3)
[1] "abc"
stri_sub("abcde",1,1)
[1] "a"
stri_sub("abcde",-3,-1)
[1] "cde"

このパッケージはgithubからインストールできます:https : //github.com/Rexamine/stringi

現在CRANで利用できます。単に入力してください

install.packages("stringi")

このパッケージをインストールします。


20
str = 'This is an example'
n = 7
result = substr(str,(nchar(str)+1)-n,nchar(str))
print(result)

> [1] "example"
> 

12

もう1つの合理的に簡単な方法は、正規表現を使用することsubです。

sub('.*(?=.$)', '', string, perl=T)

つまり、「1つの文字が続くすべてのものを取り除く」です。最後からさらに多くの文字を取得するには、先読みアサーションにドットをいくつでも追加します。

sub('.*(?=.{2}$)', '', string, perl=T)

where .{2}..、つまり「任意の2文字」を意味します。つまり、「すべての後に2文字が続くものを取り除く」という意味です。

sub('.*(?=.{3}$)', '', string, perl=T)

3文字の場合など。変数で取得する文字数を設定できますがpaste、変数値を正規表現文字列に含める必要があります。

n = 3
sub(paste('.+(?=.{', n, '})', sep=''), '', string, perl=T)

2
すべての先読みなどを回避するために、次のようにすることができますregmatches(x, regexpr(".{6}$", x))
thelatemail

10

更新mdsumnerで指摘されているように、substrはベクトル化されているため、元のコードはすでにベクトル化されています。もっと注意する必要があります。

そして、あなたは(に基づいてベクトル化バージョンたい場合Andrieのコード)

substrRight <- function(x, n){
  sapply(x, function(xx)
         substr(xx, (nchar(xx)-n+1), nchar(xx))
         )
}

> substrRight(c("12345","ABCDE"),2)
12345 ABCDE
 "45"  "DE"

キャラクターを取得するように変更(nchar(x)-n)したことに注意してください。(nchar(x)-n+1)n


私はあなたが「(nchar(x)-n)(nchar(x)-n+1)」を意味すると思います
徐王

8

substring()関数を使用した単純なベースRソリューション(この関数が存在することを誰もが知っていましたか?):

RIGHT = function(x,n){
  substring(x,nchar(x)-n+1)
}

これは基本的に substr()下ていますが、デフォルトの最終値は1,000,000です。

例:

> RIGHT('Hello World!',2)
[1] "d!"
> RIGHT('Hello World!',8)
[1] "o World!"

6

の代替方法substrは、文字列を単一の文字のリストに分割し、以下を処理することです。

N <- 2
sapply(strsplit(x, ""), function(x, n) paste(tail(x, n), collapse = ""), N)

6
私はsystem.time()の戦いの醸造を感じています:-)
カール・ウィトフト

4

私も使用していますsubstrが、使い方が異なります。「Give me your food」の最後の6文字を抽出したい。手順は次のとおりです。

(1)キャラクターを分割する

splits <- strsplit("Give me your food.", split = "")

(2)最後の6文字を抽出する

tail(splits[[1]], n=6)

出力:

[1] " " "f" "o" "o" "d" "."

各文字はでアクセスできますsplits[[1]][x]。xは1〜6です。


3

以前の誰かが私のものと同様の解決策を使用していますが、以下のように考える方が簡単です:

> text<-"some text in a string" # we want to have only the last word "string" with 6 letter
> n<-5 #as the last character will be counted with nchar(), here we discount 1
> substr(x=text,start=nchar(text)-n,stop=nchar(text))

これにより、必要に応じて最後の文字が表示されます。


3

これを試して:

x <- "some text in a string"
n <- 5
substr(x, nchar(x)-n, nchar(x))

それは与えるべきです:

[1] "string"

1

次のコードを使用して、文字列の最後の文字を取得しました。

    substr(output, nchar(stringOfInterest), nchar(stringOfInterest))

nchar(stringOfInterest)を使用して、最後の数文字を取得する方法を理解できます。


0

@Andrieソリューションを少し変更すると、次のような補足もあります。

substrR <- function(x, n) { 
  if(n > 0) substr(x, (nchar(x)-n+1), nchar(x)) else substr(x, 1, (nchar(x)+n))
}
x <- "moSvmC20F.5.rda"
substrR(x,-4)
[1] "moSvmC20F.5"

それが私が探していたものです。そしてそれは左側に誘います:

substrL <- function(x, n){ 
  if(n > 0) substr(x, 1, n) else substr(x, -n+1, nchar(x))
}
substrL(substrR(x,-4),-2)
[1] "SvmC20F.5"

0

文字の範囲を選択する必要がある場合に備えて:

# For example, to get the date part from the string

substrRightRange <- function(x, m, n){substr(x, nchar(x)-m+1, nchar(x)-m+n)}

value <- "REGNDATE:20170526RN" 
substrRightRange(value, 10, 8)

[1] "20170526"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.