선행 및 후행 공백을 자르는 방법?


360

data.frame에서 선행 및 후행 공백에 문제가 있습니다. 예를 들어 특정 조건을 기준으로 특정 row을 살펴보고 싶습니다 data.frame.

> myDummy[myDummy$country == c("Austria"),c(1,2,3:7,19)] 

[1] codeHelper     country        dummyLI    dummyLMI       dummyUMI       
[6] dummyHInonOECD dummyHIOECD    dummyOECD      
<0 rows> (or 0-length row.names)

오스트리아가 분명히 내 나라에 있었던 이후로 왜 내가 예상 한 결과를 얻지 못했는지 궁금했습니다 data.frame. 내 코드 기록을 살펴보고 무엇이 잘못되었는지 알아 내려고 시도한 후 시도했습니다.

> myDummy[myDummy$country == c("Austria "),c(1,2,3:7,19)]
   codeHelper  country dummyLI dummyLMI dummyUMI dummyHInonOECD dummyHIOECD
18        AUT Austria        0        0        0              0           1
   dummyOECD
18         1

내가 명령에서 변경 한 것은 오스트리아 다음에 추가 공백입니다.

더 성가신 문제가 분명히 발생합니다. 예를 들어 국가 열을 기준으로 두 프레임을 병합하려고합니다. 하나 data.frame"Austria "다른 프레임이있는 동안 사용합니다 "Austria". 일치하지 않습니다.

  1. 문제를 알 수 있도록 화면에 공백을 '표시'하는 좋은 방법이 있습니까?
  2. R에서 선행 및 후행 공백을 제거 할 수 있습니까?

지금까지 Perl공백을 제거 하는 간단한 스크립트 를 작성 했지만 R에서 어떻게 든 할 수 있다면 좋을 것입니다.


1
방금 sub()Perl표기법 을 사용하는 것을 보았습니다 . 미안합니다. 이 기능을 사용하려고합니다. 그러나 첫 번째 질문에 대해서는 아직 해결책이 없습니다.
mropa

4
hadley가 지적한 것처럼이 정규식 "^ \\ s + | \\ s + $"는 선행 및 후행 공백을 식별합니다. 따라서 x <-gsub ( "^ \\ s + | \\ s + $", "", x)이 옵션이있는 많은 R 읽기 기능 : strip.white = FALSE
Jay

답변:


456

아마도 가장 좋은 방법은 데이터 파일을 읽을 때 후행 공백을 처리하는 것입니다. 매개 변수 를 사용 read.csv하거나 read.table설정할 수 있습니다 strip.white=TRUE.

나중에 문자열을 정리하려면 다음 기능 중 하나를 사용할 수 있습니다.

# returns string w/o leading whitespace
trim.leading <- function (x)  sub("^\\s+", "", x)

# returns string w/o trailing whitespace
trim.trailing <- function (x) sub("\\s+$", "", x)

# returns string w/o leading or trailing whitespace
trim <- function (x) gsub("^\\s+|\\s+$", "", x)

이 기능 중 하나를 사용하려면 다음을 수행하십시오 myDummy$country.

 myDummy$country <- trim(myDummy$country)

사용할 수있는 공백을 '표시'하려면 다음을 수행하십시오.

 paste(myDummy$country)

공백을 쉽게 찾을 수 있도록 따옴표 ( ")로 묶인 문자열을 표시합니다.


7
hadley가 지적한 것처럼이 정규식 "^ \\ s + | \\ s + $"는 선행 및 후행 공백을 식별합니다. 따라서 x <-gsub ( "^ \\ s + | \\ s + $", "", x)이 옵션이있는 많은 R 읽기 기능 : strip.white = FALSE
Jay

50
패키지 str_trim에서 참조하십시오 stringr.
Richie Cotton

1
"나중에 사용할 수 있도록 트림 기능이 저장되었습니다."
Chris Beeley

4
불행히도 strip.white = TRUE는 인용되지 않은 문자열에서만 작동합니다.
Rodrigo

2
R 3.2.0에서 공백을 트리밍하는 훨씬 쉬운 방법이 있습니다. 다음 답변을보십시오!
Alex

519

R 3.2.0부터는 선행 / 후행 공백을 제거하기위한 새로운 기능이 도입되었습니다.

trimws()

참조 : http://stat.ethz.ch/R-manual/R-patched/library/base/html/trimws.html


2
최상의 답변의 정의에 따라 다릅니다. 이 답변은 (+1)을 아는 것이 좋지만 빠른 테스트에서는 다른 대안보다 빠르지 않았습니다.
A5C1D2H2I1M1N2O1R2T1

\n대상 문자 클래스에 있음에도 불구하고 여러 줄 문자열에서 작동하지 않는 것 같습니다 . trimws("SELECT\n blah\n FROM foo;")여전히 줄 바꿈이 포함되어 있습니다.
Jubbles

6
@Jubbles 예상되는 동작입니다. 줄에 당신이 손질을하기 위해 앞뒤 공백이 없습니다. 문자열의 각 줄에서 선행 및 후행 공백을 제거하려면 먼저 분할해야합니다. 다음과 같이 : trimws (strsplit ( "SELECT \ n blah \ n FROM foo;", "\ n") [[1]])
wligtenberg

1
최신 버전의 R에 내장 된 함수이지만, 그것은 단지 후드 아래에서 PERL 스타일 정규식을 수행합니다. 이 작업을 수행하는 데 필요한 빠른 사용자 정의 C 코드가 필요할 수 있습니다. 아마도 trimws정규 표현식이 충분히 빠를 수도 있습니다. stringr::str_trim(기반 stringi)은 완전히 독립적 인 국제화 된 문자열 라이브러리를 사용한다는 점에서 흥미 롭습니다. 당신은 공백이 국제화 문제로부터 면역 될 것이라고 생각할 것입니다. 나는 기본 대 결과의 비교 본 적이 없어요 stringr/ stringi또는 벤치 마크를.
Jack Wasey

어떤 이유로 나는 알아낼 수 없었고, trimws()앞의 공백을 제거하지 않았으며, Bryan의 trim.strings()아래 (단 1 표, 내!)는 ...
PatrickT

89

공백을 조작하려면 stringr 패키지에서 str_trim ()을 사용하십시오. 패키지는 2013 년 2 월 15 일자 매뉴얼이며 CRAN입니다. 이 함수는 문자열 벡터를 처리 할 수도 있습니다.

install.packages("stringr", dependencies=TRUE)
require(stringr)
example(str_trim)
d4$clean2<-str_trim(d4$V2)

(신용은 논평자에게 간다 : R. Cotton)


2
이 솔루션은 제거 trimws()할 수없는 일부 돌연변이 공백 을 제거했습니다.
Richard Telford

1
@RichardTelford 예를 들어 주시겠습니까? 그것이 버그의 버그로 간주 될 수 있기 때문입니다.
wligtenberg

IMO는 최고의 솔루션입니다. 코드가 많고 성능이 우수하지 않음
Peter

require (stringr) 덕분에 설명서 또는 예제에 필요한 코드 줄이 없었습니다!
pgee70

23

선행 및 후행 공백을 제거 하는 간단한 기능 :

trim <- function( x ) {
  gsub("(^[[:space:]]+|[[:space:]]+$)", "", x)
}

용법:

> text = "   foo bar  baz 3 "
> trim(text)
[1] "foo bar  baz 3"

11

ad1) 공백을 보려면 print.data.frame수정 된 인수로 직접 호출 할 수 있습니다 .

print(head(iris), quote=TRUE)
#   Sepal.Length Sepal.Width Petal.Length Petal.Width  Species
# 1        "5.1"       "3.5"        "1.4"       "0.2" "setosa"
# 2        "4.9"       "3.0"        "1.4"       "0.2" "setosa"
# 3        "4.7"       "3.2"        "1.3"       "0.2" "setosa"
# 4        "4.6"       "3.1"        "1.5"       "0.2" "setosa"
# 5        "5.0"       "3.6"        "1.4"       "0.2" "setosa"
# 6        "5.4"       "3.9"        "1.7"       "0.4" "setosa"

?print.data.frame다른 옵션 도 참조하십시오 .


9

grep 또는 grepl을 사용하여 공백과 하위가있는 관측치를 찾아 제거하십시오.

names<-c("Ganga Din\t","Shyam Lal","Bulbul ")
grep("[[:space:]]+$",names)
[1] 1 3
grepl("[[:space:]]+$",names)
[1]  TRUE FALSE  TRUE
sub("[[:space:]]+$","",names)
[1] "Ganga Din" "Shyam Lal" "Bulbul"  

7
좀 더 간결하게 "^\\s+|\\s+$"
말하면

4
hadley의 정규 표현식 gsub대신 사용해야한다는 것을 지적하고 싶었습니다 sub. 로 sub선두에 공백 ...이없는 경우에만 공백을 후행 제거합니다
f3lix

perl = FALSE와 함께 \ s 등을 사용할 수 있다는 것을 몰랐습니다. 문서에 따르면 POSIX 구문이 사용되지만 실제로 허용되는 구문은 TRE 정규식 라이브러리 laurikari.net/tre/documentation/regex-syntax에
Jyotirmoy Bhattacharya

5

user56의 의견으로 답변을 추가하고 싶지만 독립 답변으로 쓸 수는 없습니다. 선행 및 후행 공백 제거는 gdata 패키지의 trim () 함수를 통해 수행 할 수 있습니다.

require(gdata)
example(trim)

사용 예 :

> trim("   Remove leading and trailing blanks    ")
[1] "Remove leading and trailing blanks"

5

입력 사이에 공백이 여러 개인 경우 다른 관련 문제가 발생합니다.

> a <- "  a string         with lots   of starting, inter   mediate and trailing   whitespace     "

그런 다음 일반 표현식을 사용하여이 문자열을 "실제"토큰으로 쉽게 분할 할 수 있습니다 split.

> strsplit(a, split=" +")
[[1]]
 [1] ""           "a"          "string"     "with"       "lots"      
 [6] "of"         "starting,"  "inter"      "mediate"    "and"       
[11] "trailing"   "whitespace"

비어 있지 않은 문자열의 시작 부분에 일치가 있으면 출력의 첫 번째 요소는 ' ""'이지만 문자열 끝에 일치하는 경우 출력은 다음과 같습니다. 일치하는 항목이 제거되었습니다.


5

또 다른 옵션은 패키지 의 stri_trim기능 을 사용하여 stringi기본적으로 선행 및 후행 공백을 제거하는 것입니다.

> x <- c("  leading space","trailing space   ")
> stri_trim(x)
[1] "leading space"  "trailing space"

선행 공백 만 제거하려면을 사용하십시오 stri_trim_left. 후행 공백 만 제거하려면을 사용하십시오 stri_trim_right. 다른 선행 또는 후행 문자를 제거하려면을 사용하여 지정해야합니다 pattern =.

자세한 내용은 참조하십시오 ?stri_trim.


2

trim.strings ()선행 및 후행 공백을 다음과 같이 트리밍 하는 기능을 만들었습니다 .

# Arguments:    x - character vector
#            side - side(s) on which to remove whitespace 
#                   default : "both"
#                   possible values: c("both", "leading", "trailing")

trim.strings <- function(x, side = "both") { 
    if (is.na(match(side, c("both", "leading", "trailing")))) { 
      side <- "both" 
      } 
    if (side == "leading") { 
      sub("^\\s+", "", x)
      } else {
        if (side == "trailing") {
          sub("\\s+$", "", x)
    } else gsub("^\\s+|\\s+$", "", x)
    } 
} 

예를 들어,

a <- c("   ABC123 456    ", " ABC123DEF          ")

# returns string without leading and trailing whitespace
trim.strings(a)
# [1] "ABC123 456" "ABC123DEF" 

# returns string without leading whitespace
trim.strings(a, side = "leading")
# [1] "ABC123 456    "      "ABC123DEF          "

# returns string without trailing whitespace
trim.strings(a, side = "trailing")
# [1] "   ABC123 456" " ABC123DEF"   

1

가장 좋은 방법은 다듬기 ()

다음 코드는이 기능을 전체 데이터 프레임에 적용합니다

mydataframe <-data.frame (lapply (mydataframe, trimws), stringsAsFactors = FALSE)


또는 df[] <- lapply(df, trimws)더 콤팩트해야합니다. 그러나 두 경우 모두 열을 문자로 강제 변환합니다. df[sapply(df,is.character)] <- lapply(df[sapply(df,is.character)], trimws)안전하다.
Moody_Mudskipper

1

trim ()을 시도했습니다. 공백 및 '\ n'과 잘 작동합니다. x = '\ n 강화, J. \ n'

트림 (x)


0
myDummy[myDummy$country == "Austria "] <- "Austria"

그런 다음 R이 "오스트리아"를 레벨로 인식하지 않도록해야합니다. 레벨로 "USA"와 "Spain"을 가지고 있다고 가정 해 봅시다 :

myDummy$country = factor(myDummy$country, levels=c("Austria", "USA", "Spain"))

가장 높은 투표 응답보다 조금 덜 위협적이지만 여전히 효과가 있습니다.

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