回答:
私はベースRには何も認識していませんが、substr
and を使用してこれを行う関数を作成するのは簡単です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"
nchar(x)
ローカル変数に割り当てることにより、2回の呼び出しを回避する方が効率的ですか?
stringr
パッケージを使用してもかまわない場合str_sub
は、ネガを使用して逆算できるので便利です。
x <- "some text in a string"
str_sub(x,-6,-1)
[1] "string"
または、マックスがこの回答へのコメントで指摘しているように、
str_sub(x, start= -6)
[1] "string"
stringr
使用stringi
して作り直されていたと思うので、今はNAなどで動作するはずです。
パッケージの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")
このパッケージをインストールします。
もう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)
regmatches(x, regexpr(".{6}$", x))
更新: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)
」を意味すると思います
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!"
以前の誰かが私のものと同様の解決策を使用していますが、以下のように考える方が簡単です:
> 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))
これにより、必要に応じて最後の文字が表示されます。
@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"