문자열에서 모든 공백을 제거하는 방법은 무엇입니까?


답변:


258

일반적으로 벡터화 된 솔루션을 원하므로 더 나은 테스트 예제가 있습니다.

whitespace <- " \t\n\r\v\f" # space, tab, newline, 
                            # carriage return, vertical tab, form feed
x <- c(
  " x y ",           # spaces before, after and in between
  " \u2190 \u2192 ", # contains unicode chars
  paste0(            # varied whitespace     
    whitespace, 
    "x", 
    whitespace, 
    "y", 
    whitespace, 
    collapse = ""
  ),   
  NA                 # missing
)
## [1] " x y "                           
## [2] " ← → "                           
## [3] " \t\n\r\v\fx \t\n\r\v\fy \t\n\r\v\f"
## [4] NA

기본 R 접근 방식 : gsub

gsub문자열 ( fixed = TRUE) 또는 정규 표현식 ( fixed = FALSE, 기본값) 의 모든 인스턴스를 다른 문자열로 바꿉니다 . 모든 공백을 제거하려면 다음을 사용하십시오.

gsub(" ", "", x, fixed = TRUE)
## [1] "xy"                            "←→"             
## [3] "\t\n\r\v\fx\t\n\r\v\fy\t\n\r\v\f" NA 

DWin에서 언급했듯이이 경우 fixed = TRUE고정 문자열을 일치시키는 것이 정규식을 일치시키는 것보다 빠르기 때문에이 경우 에는 필요하지 않지만 약간 더 나은 성능을 제공합니다.

모든 유형의 공백을 제거하려면 다음을 사용하십시오.

gsub("[[:space:]]", "", x) # note the double square brackets
## [1] "xy" "←→" "xy" NA 

gsub("\\s", "", x)         # same; note the double backslash

library(regex)
gsub(space(), "", x)       # same

"[:space:]"모든 공백 문자와 일치하는 R 특정 정규식 그룹입니다. \s같은 일을하는 언어 독립적 인 정규 표현입니다.


stringr방법 : str_replace_allstr_trim

stringr기본 R 함수를 중심으로보다 사람이 읽을 수있는 래퍼를 제공합니다 (2014 년 12 월 현재 개발 버전에는 위에 stringi언급 된 분기가 있음 ). [를 사용하는 위의 명령과 동등한 기능은 다음과 같습니다 str_replace_all][3].

library(stringr)
str_replace_all(x, fixed(" "), "")
str_replace_all(x, space(), "")

stringr또한 str_trim앞뒤 공백 만 제거 하는 기능이 있습니다.

str_trim(x) 
## [1] "x y"          "← →"          "x \t\n\r\v\fy" NA    
str_trim(x, "left")    
## [1] "x y "                   "← → "    
## [3] "x \t\n\r\v\fy \t\n\r\v\f" NA     
str_trim(x, "right")    
## [1] " x y"                   " ← →"    
## [3] " \t\n\r\v\fx \t\n\r\v\fy" NA      

stringi방법 : stri_replace_all_charclassstri_trim

stringi플랫폼 독립적 인 ICU 라이브러리를 기반으로 하며 광범위한 문자열 조작 기능을 갖추고 있습니다. 등가물 위의은 다음과 같습니다 :

library(stringi)
stri_replace_all_fixed(x, " ", "")
stri_replace_all_charclass(x, "\\p{WHITE_SPACE}", "")

여기서 "\\p{WHITE_SPACE}"등가 공백 인 것으로 간주 유니 코드 코드 포인트들의 세트에 대한 대체 구문 "[[:space:]]", "\\s"space(). 보다 복잡한 정규식 대체를 위해도 있습니다 stri_replace_all_regex.

stringi또한 트림 기능이 있습니다.

stri_trim(x)
stri_trim_both(x)    # same
stri_trim(x, "left")
stri_trim_left(x)    # same
stri_trim(x, "right")  
stri_trim_right(x)   # same

2
@ 아니 코. fixed = TRUE를 사용한 이유가 있습니까?
IRTFM

2
@DWin R이 정규 표현식을 호출 할 필요가 없다는 것을 알고 있으면 더 빠릅니다. 이 경우 실제로 아무런 차이가 없습니다. 나는 그렇게하는 습관에 처해 있습니다.
Aniko

"[[:space:]]"와 사이에 차이가 "\\s"있습니까?
Sacha Epskamp

5
flyordie.sin.khk.be/2011/05/04/day-35-replacing-characters 를 확인 하거나? regex를 입력하면 [: space :]가 "공백 문자 : 탭, 줄 바꿈"으로 사용됩니다. , 세로 탭, 용지 공급, 캐리지 리턴 및 공간 " 공간보다 더 많은 것
Ksilem 경

1
@Aniko 큰 편집에 신경 쓰지 않기를 바랍니다. 이 질문은 매우 인기가 높으므로 답을보다 철저히해야하는 것처럼 보였습니다.
Richie Cotton

18

str_trim (, side = "both")으로 문자열의 시작과 끝에서 공백을 제거하는 "stringr"패키지에 대해 배웠지 만 다음과 같은 대체 기능도 있습니다.

a <- " xx yy 11 22 33 " 
str_replace_all(string=a, pattern=" ", repl="")

[1] "xxyy112233"

3
stringr 패키지는 모든 인코딩에서 잘 작동하지 않습니다. 더 많은 정보를 확인하려면 stringi 패키지가 더 나은 솔루션입니다. github.com/Rexamine/stringi
bartektartanus

8

위에 쓰여진 영혼은 공간 만 제거한다는 점에 유의하십시오. 패키지 stri_replace_all_charclass에서 탭 또는 줄 바꾸기를 제거하려는 경우 stringi.

library(stringi)
stri_replace_all_charclass("   ala \t  ma \n kota  ", "\\p{WHITE_SPACE}", "")
## [1] "alamakota"

4
stringi패키지가 CRAN에 있습니다. 즐기십시오! :)
bartektartanus

1
위의 명령이 잘못되었습니다. 올바른 방법은 stri_replace_all_charclass ( "ala \ t ma \ n kota", "\\ p {WHITE_SPACE}", "")
Lucas Fortini

5
stringi몇 달 동안 사용 하고 얼마나 강력하고 효율적인지 알게 된 후에는 문자열 연산을위한 패키지가되었습니다. 너희들은 그것으로 멋진 일을했다.
Rich Scriven

7

[[:blank:]]모든 종류의 가로 공백 문자를 일치시키는 데 사용 합니다.

gsub("[[:blank:]]", "", " xx yy 11 22  33 ")
# [1] "xxyy112233"

6
x = "xx yy 11 22 33"

gsub(" ", "", x)

> [1] "xxyy112233"

4

tidyverse str_squish()패키지 stringr의 기능 은 마법을 수행합니다!

library(dplyr)
library(stringr)

df <- data.frame(a = c("  aZe  aze s", "wxc  s     aze   "), 
                 b = c("  12    12 ", "34e e4  "), 
                 stringsAsFactors = FALSE)
df <- df %>%
  rowwise() %>%
  mutate_all(funs(str_squish(.))) %>%
  ungroup()
df

# A tibble: 2 x 2
  a         b     
  <chr>     <chr> 
1 aZe aze s 12 12 
2 wxc s aze 34e e4

4
코드에 링크하지 마십시오. 답변의 본문에 추가하고 여기에 설명하여 답변에 더 장기적인 가치를 부여하십시오.
R Balasubramanian

이 지침을 상기시켜 준 @RBalasubramanian에게 감사한다. 나는 앞으로 그것을 따를 것입니다.
damianooldoni

이것이 어떻게 질문에 대답하는지 모르겠습니다. str_squish모든 공백을 제거하지는 않습니다. 여러 공간을 자르고 대체합니다.
쐐기풀

0

이렇게하면 데이터 프레임의 모든 문자 변수에서 모든 공백을 제거 할 수 있습니다. 일부 변수 만 선택하려면 mutate또는을 사용하십시오 mutate_at.

library(dplyr)
library(stringr)

remove_all_ws<- function(string){
    return(gsub(" ", "", str_squish(string)))
}

df<-df %>%  mutate_if(is.character, remove_all_ws)

-1

stringr 라이브러리에서 다음을 시도 할 수 있습니다.

  1. 연속 채우기 공백 제거
  2. 빈칸 채우기

    도서관 (스트링거)

                2.         1.
                |          |
                V          V
    
        str_replace_all(str_trim(" xx yy 11 22  33 "), " ", "")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.