Rの文字列から最後のn文字を取得するにはどうすればいいですか? SQLのRIGHTのような機能はありますか?
Rを基にしたものは何も知りませんが、substr
と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"
stringr
パッケージを使用しても構わないのであれば、str_sub
が便利です。ネガティブを使用して逆方向に数えることができるからです。
x <- "some text in a string"
str_sub(x,-6,-1)
[1] "string"
あるいは、マックスがこの答えへのコメントで指摘しているように、
str_sub(x, start= -6)
[1] "string"
stringi
パッケージのstri_sub
関数を使用してください。末尾から部分文字列を取得するには、負数を使用します。以下の例を見てください。
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")
このパッケージをインストールする。
str = 'This is an example'
n = 7
result = substr(str,(nchar(str)+1)-n,nchar(str))
print(result)
> [1] "example"
>
UPDATE: 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"
n
文字を取得するために(nchar(x)-n)
を(nchar(x)-n+1)
に変更したことに注意してください。
もう1つの合理的で簡単な方法は、正規表現とsub
を使うことです。
sub('.*(?=.$)', '', string, Perl=T)
だから、「1文字が続くすべてを取り除きなさい」。最後からさらに多くの文字を取得するには、先読みアサーションに多くのドットを追加します。
sub('.*(?=.{2}$)', '', string, Perl=T)
ここで、.{2}
は..
、つまり「任意の2文字」を意味します。つまり、「すべての文字の後に2文字が続く」という意味です。
sub('.*(?=.{3}$)', '', string, Perl=T)
変数を使って取得する文字数を設定できますが、変数値を正規表現文字列にpaste
する必要があります。
n = 3
sub(paste('.+(?=.{', n, '})', sep=''), '', string, Perl=T)
substring()
関数を使った簡単なbase 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!"
substr
に代わるものは、文字列を単一の文字のリストに分割し、次のように処理することです。
N <- 2
sapply(strsplit(x, ""), function(x, n) paste(tail(x, n), collapse = ""), N)
私はsubstr
も使いますが、違う方法で使います。 「食べてください」の最後の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です。
これを試して:
x <- "some text in a string"
n <- 5
substr(x, nchar(x)-n, nchar(x))
次のものが必要です。
[1] "string"
以前の誰かが私と同じような解決策を使っていますが、私は以下のように考えるのが簡単だと思います。
> 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))
これにより、必要に応じて最後の文字が表示されます。
文字列の最後の文字を取得するには、次のコードを使用しました。
substr(output, nchar(stringOfInterest), nchar(stringOfInterest))
最後の数文字を取得する方法を理解するためにnchar(stringOfInterest)で遊ぶことができます。
念のため、文字の範囲を選択する必要がある場合
# 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"
@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"