2011-11-01 460 views

回答

191

我不知道在基礎R任何東西,但它是直線前進,使一個函數來做到這一點使用substrnchar

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" 
+3

並觀看了來港... – hadley

+0

使用stringi包。它適用於NAs和所有編碼:) – bartektartanus

+0

避免通過將'nchar(x)'分配給局部變量兩次更有效嗎? –

10

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" 

請注意,我已經改變(nchar(x)-n)(nchar(x)-n+1)得到n字符。

+0

我認爲你的意思是「(nchar(x)-n)'到'(nchar(x)-n + 1)'」 –

+0

Andrie's已經被矢量化了。 – mdsumner

+3

sapply!=矢量化 –

119

如果你不介意使用stringr包,str_sub很方便,因爲你可以使用底片向後計數:

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

或者像Max在這個答案評論指出,

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

另外,str_sub(x,start = -n)獲取n個最後的字符。 – Max

+1

stringr不適用於NA的值和所有編碼。我強烈推薦stringi包:) – bartektartanus

+2

我相信'stringr'已經使用'stringi'作爲後端重製,所以現在應該與NAs等一起工作。 –

6

substr的替代方法是將字符串分割成單個字符和處理的列表:

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

我感覺系統。時間()戰鬥釀造:-) –

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

> [1] "example" 
> 
+0

這是最好的答案,不涉及任何軟件包的使用 – prab4th

33

使用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") 

安裝該軟件包。

7

另一種相當簡單的方法是使用正則表達式和sub

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

所以,「擺脫一切之後的一個字符的」。爲了搶關底更多的字符,在先行斷言加然而,許多點:

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

其中.{2}意味着..,或者「任何兩個字符」,所以意思是「擺脫一切跟着兩個字符」。

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

三個字符等您可以設置字符變量搶的數目,但你必須paste變量值進入正則表達式字符串:

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

爲了避免所有的預見等,你可以做'regmatches(x,regexpr(「。{6} $ 「,x))' – thelatemail

4

我也使用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.

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" 
2

有人之前使用了類似的解決方案,我的,但我覺得它更容易如下思考:

> 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)) 

根據需要這將使最後一個字符。

1

我使用下面的代碼來獲取字符串的最後一個字符。

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

你可以玩nchar(stringOfInterest)來弄清楚如何得到最後幾個字符。

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!"