문자열의 첫 번째 문자 가져 오기 및 제거


102

각 캐릭터에 다른 값을 할당하여 문자열을 사용하여 2 차원 산책을하고 싶습니다. 문자열의 첫 번째 문자를 '팝'하고 사용하고 나머지 문자열에 대해 반복 할 계획이었습니다.

이와 같은 것을 어떻게 얻을 수 있습니까?

x <- 'hello stackoverflow'

다음과 같이 할 수 있기를 바랍니다.

a <- x.pop[1]

print(a)

'h'
print(x)

'ello stackoverflow'

답변:


167

을 참조하십시오 ?substring.

x <- 'hello stackoverflow'
substring(x, 1, 1)
## [1] "h"
substring(x, 2)
## [1] "ello stackoverflow"

pop값을 반환하고 저장된 데이터를 업데이트하는 부작용 이있는 메서드를 갖는 아이디어는 x객체 지향 프로그래밍의 개념입니다. 따라서 pop문자 벡터에서 작동 할 함수를 정의하는 대신 메서드 로 참조 클래스 를 만들 수 있습니다 pop.

PopStringFactory <- setRefClass(
  "PopString",
  fields = list(
    x = "character"  
  ),
  methods = list(
    initialize = function(x)
    {
      x <<- x
    },
    pop = function(n = 1)
    {
      if(nchar(x) == 0)
      {
        warning("Nothing to pop.")
        return("")
      }
      first <- substring(x, 1, n)
      x <<- substring(x, n + 1)
      first
    }
  )
)

x <- PopStringFactory$new("hello stackoverflow")
x
## Reference class object of class "PopString"
## Field "x":
## [1] "hello stackoverflow"
replicate(nchar(x$x), x$pop())
## [1] "h" "e" "l" "l" "o" " " "s" "t" "a" "c" "k" "o" "v" "e" "r" "f" "l" "o" "w"

15

str_substringr 패키지 에도 있습니다.

x <- 'hello stackoverflow'
str_sub(x, 2) # or
str_sub(x, 2, str_length(x))
[1] "ello stackoverflow"

10

stringi패키지 에서이 기능 사용

> x <- 'hello stackoverflow'
> stri_sub(x,2)
[1] "ello stackoverflow"

8

substring확실히 최고입니다.하지만 여기에 하나의 strsplit대안이 있습니다. 아직 보지 못했기 때문입니다.

> x <- 'hello stackoverflow'
> strsplit(x, '')[[1]][1]
## [1] "h"

또는 동등하게

> unlist(strsplit(x, ''))[1]
## [1] "h"

그리고 당신은 할 수있는 paste문자열의 나머지 다시 함께.

> paste0(strsplit(x, '')[[1]][-1], collapse = '')
## [1] "ello stackoverflow"

5

첫 번째 문자 제거 :

x <- 'hello stackoverflow'
substring(x, 2, nchar(x))

아이디어는 2에서 시작하여 x의 문자 수까지 모든 문자를 선택하는 것입니다. 이것은 단어 나 구의 문자 수가 같지 않을 때 중요합니다.

첫 글자를 선택하는 것은 이전 답변처럼 간단합니다.

substring(x,1,1)

2

또 다른 대안은 정규식 함수 regmatchesregexec.

# the original example
x <- 'hello stackoverflow'

# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', x))

전체 문자열, 첫 번째 문자 및 길이 1 목록의 "팝핑 된"결과를 반환합니다.

myStrings
[[1]]
[1] "hello stackoverflow" "h"                   "ello stackoverflow" 

이는 list(c(x, substr(x, 1, 1), substr(x, 2, nchar(x)))). 즉, 원하는 요소의 수퍼 세트와 전체 문자열을 포함합니다.


추가 sapply하면이 메서드가 길이가 1보다 큰 문자형 벡터에 대해 작동 할 수 있습니다.

# a slightly more interesting example
xx <- c('hello stackoverflow', 'right back', 'at yah')

# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', xx))

이렇게하면 첫 번째 요소로 일치하는 전체 문자열이있는 목록과 ()다음 요소로 캡처 된 일치하는 하위 표현식이있는 목록이 반환 됩니다. 따라서 정규 표현식 '(^.)(.*)'에서는 (^.)첫 번째 문자와 (.*)일치하고 나머지 문자 와 일치합니다.

myStrings
[[1]]
[1] "hello stackoverflow" "h"                   "ello stackoverflow" 

[[2]]
[1] "right back" "r"          "ight back" 

[[3]]
[1] "at yah" "a"      "t yah" 

이제 trusty sapply+ [메서드를 사용 하여 원하는 부분 문자열을 추출 할 수 있습니다 .

myFirstStrings <- sapply(myStrings, "[", 2)
myFirstStrings
[1] "h" "r" "a"
mySecondStrings <- sapply(myStrings, "[", 3)
mySecondStrings
[1] "ello stackoverflow" "ight back"          "t yah"

이것은 매우 좋은 속임수이지만 질문을 놓친 것 같습니다.
pedrosaurio

다른 답변과 동일한 출력을 생성 할 수 있으므로 추가로 설명해야합니다. sapply추출에 사용되는 최종 코드 블록을 참조하십시오 . 질문에 지정된대로 첫 번째 문자를 "팝핑"하는 것은 결과 벡터 (mySecondStrings)에서이 프로세스를 반복하는 문제입니다.
lmo

물론 방금 추가 한 추가 설명과 함께 작동하지만 그래도해야하는 것보다 더 복잡합니다.
pedrosaurio
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.