R 벡터의 모든 요소에서 마지막 n 문자를 제거하는 방법


106

저는 R을 처음 접했고 벡터의 모든 요소 (배열?)에서 마지막 n 문자를 제거하는 방법에 대한 간단한 예를 온라인에서 찾을 수 없습니다.

저는 Java 배경에서 왔기 때문에 모든 요소를 ​​반복하고 모든 요소 a$data에서 마지막 3 개 문자를 제거하고 싶습니다 .

어떻게 하시겠습니까?

답변:


115

다음은 내가 할 일의 예입니다. 나는 그것이 당신이 찾고있는 것이기를 바랍니다.

char_array = c("foo_bar","bar_foo","apple","beer")
a = data.frame("data"=char_array,"data2"=1:4)
a$data = substr(a$data,1,nchar(a$data)-3)

a는 이제 다음을 포함해야합니다.

  data data2
1 foo_ 1
2 bar_ 2
3   ap 3
4    b 4

재미있게도 원하는 효과를 얻으려면 로 변경 -3해야 -0했습니다! 다음과 같은 날짜가있는 데이터가 많이 있습니다 "2014-03-27 23:00:00 GMT" "2014-03-31 00:00:00 BST".-예, 두 개의 시간대가 함께 있고 as.Date 함수가 예기치 않은 결과를 반환합니다 (BST 날짜의 경우 하루 이전). 따라서 시간대 스탬프를 제거하고 싶었습니다. 이렇게 -0시간과 함께, 그것은 사라
LucasSeveryn

또한 strptime 함수를 고려하십시오. 그래도 전에 시간대를 사용하지 않았습니다. 나는 그것을 인식 할 것이라고 생각한다. "% Z"는 표준 시간대를 인식합니다. sapply 기능도 제거했습니다. R이 함수를 벡터화하는 것을 얼마나 좋아하는지 잊었습니다.
nfmcclure

@LucasSeveryn 문자 시간 표현을 시간대를 고려한 날짜로 변환하려면 질문에 맞게 편집하십시오. 원하는 결과를 직접 얻을 수있는 더 나은 답변이있을 것입니다 (예 :) strptime.
Blue Magister

84

방법은 gsub다음 과 같습니다.

cs <- c("foo_bar","bar_foo","apple","beer")
gsub('.{3}$', '', cs)
# [1] "foo_" "bar_" "ap"   "b"

4
(+1) 정규식의 열렬한 팬. 거의 모든 곳에 사용할 수 있습니다.
Rich Scriven

8
참고 : 잘라낼 문자 수보다 길면 원래 문자열을 반환합니다. 고려하십시오 gsub('.{5}$', '', 'abcd').
Tomas Greif

32

이것은 @nfmcclure의 대답과 거의 동일하지만 stringr기본 R에있는 것보다 이름이 가장 일관되고 설명적인 함수 집합을 제공하기 때문에 package를 사용하는 것을 선호합니다 (사실 저는 항상 "수를 얻는 방법 이름을 기억할 수 없기 때문에 R의 문자nchar() ).

library(stringr)
str_sub(iris$Species, end=-4)
#or 
str_sub(iris$Species, 1, str_length(iris$Species)-3)

그러면 Species열의 각 값에서 마지막 3 개 문자가 제거 됩니다.


22
stringr패키지 더 간단한 해결책이있다 : str_sub(iris$Species, end=-4)
1 월 GLX

14

stringi 패키지로도 동일한 결과를 얻을 수 있습니다 .

library('stringi')
char_array <- c("foo_bar","bar_foo","apple","beer")
a <- data.frame("data"=char_array, "data2"=1:4)
(a$data <- stri_sub(a$data, 1, -4)) # from the first to the last but 4th char
## [1] "foo_" "bar_" "ap"   "b" 

3

@Matthew_Plourde와 유사합니다. gsub

그러나 0 문자로 트리밍되는 패턴을 사용합니다. 즉, 원래 문자열이 잘라낼 문자 수보다 짧으면 ""를 반환합니다 .

cs <- c("foo_bar","bar_foo","apple","beer","so","a")
gsub('.{0,3}$', '', cs)
# [1] "foo_" "bar_" "ap"   "b"    ""    ""

차이점은 {0,3}수량 자는 0 ~ 3 개의 일치 항목을 나타내지 만 {3}정확히 3 개의 일치 항목이 필요하며 그렇지 않으면 일치 항목이 없습니다.gsub 수정되지 않은 원래 문자열을 반환하는 .

NB를 사용 {,3}하는 것은 {0,3}, 나는 단순히 후자의 표기법을 선호합니다.

정규식 한정자에 대한 자세한 내용은 https://www.regular-expressions.info/refrepeat.html을 참조하십시오.


sub()대신 사용할 수 있습니다 gsub().
sindri_baldur
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.