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와 모든 인코딩에서 잘 작동합니다 :)
bartektartanus

nchar(x)지역 변수에 할당하여 두 번 호출하는 것을 피하는 것이 더 효율적 입니까?
Dave Jarvis

206

stringr패키지 사용이 마음에 들지 않으면 str_sub음수를 사용하여 역으로 계산할 수 있으므로 편리합니다.

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

또는 Max가이 답변에 대한 의견에서 지적한 것처럼,

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

32
또한 str_sub (x, start = -n)은 n 개의 마지막 문자를 가져옵니다.
최대

2
스트링거는 NA의 값과 모든 인코딩에서 잘 작동하지 않습니다. 나는 stringi 패키지를 강력히 추천한다 :)
bartektartanus

3
나는 백엔드로 stringr사용하여 다시 만들어 졌다고 생각 stringi하므로 NA와 함께 작동해야합니다.
m-dz

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

또 다른 합리적인 방법은 정규 표현식을 사용하는 것입니다 sub.

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

따라서 "한 문자 뒤에 모든 것을 제거하십시오". 끝에서 더 많은 문자를 얻으려면 lookahead 어설 션에 많은 점을 추가하십시오.

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

어디 .{2}수단 ..그렇게하는 의미, 또는 "두 글자", "모든 것을 제거는 두 문자 다음에".

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

변수를 사용하여 잡을 문자 수를 설정할 수 있지만 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)" 을 의미한다고 생각합니다
Xu Wang

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 () 전투 양조를 감지 :-)
Carl Witthoft

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입니다.


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.