programing

선행 및 후행 공백을 어떻게 잘라낼 수 있습니까?

mytipbox 2023. 8. 6. 15:10
반응형

선행 및 후행 공백을 어떻게 잘라낼 수 있습니까?

data.frame에서 선행 및 후행 공백에 문제가 있습니다.

를 들어,한 예들어특, 나는한것봅니다을정를▁▁a▁for.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 안에서 할 수 있다면 좋을 것 같습니다.

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

trimws()

참조: 선행/미행 공백 제거

데이터 파일을 읽을 때 뒤에 오는 공백을 처리하는 것이 가장 좋은 방법일 것입니다.사용하는 경우read.csv또는read.table할 수 .strip.white=TRUE.

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

# Returns string without leading white space
trim.leading <- function (x)  sub("^\\s+", "", x)

# Returns string without trailing white space
trim.trailing <- function (x) sub("\\s+$", "", x)

# Returns string without leading or trailing white space
trim <- function (x) gsub("^\\s+|\\s+$", "", x)

중 를 음다기 사면려하용를에 하는 것.myDummy$country:

 myDummy$country <- trim(myDummy$country)

사용할 수 있는 공백을 '보여주기' 위해:

 paste(myDummy$country)

따옴표(")로 둘러싸인 문자열을 표시하여 공백을 쉽게 찾을 수 있습니다.

공백을 조작하려면 stringr 패키지에서 str_trim()을 사용합니다.패키지의 날짜는 2013년 2월 15일이며 CRAN에 있습니다.이 함수는 문자열 벡터도 처리할 수 있습니다.

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

(크레딧은 해설자: R.면)

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

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

용도:

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

1) 전화를 걸 수 . 광 1) 직 호 수 있 빈 공 간 을 보 려 면 는 고 접 할 출 보 려 면 ▁you ▁ad ▁spaces 을 간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다른 옵션의 경우.

공백이 있는 관측치를 찾으려면 grep 또는 grepl을 사용하고 공백을 제거하려면 sub를 사용합니다.

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"

gdata 패키지의 트림() 기능을 통해 선행 및 후행 빈칸을 제거할 수도 있습니다.

require(gdata)
example(trim)

사용 예:

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

답변을 사용자 56의 의견으로 추가하고 싶지만, 아직 독립적인 답변으로 작성할 수 없습니다.

다른 옵션은 다음을 사용하는 것입니다.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더 자세한 정보를 참조하십시오.

입력 사이에 공백이 여러 개 있는 경우 다음과 같은 관련 문제가 발생합니다.

> 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"

(공백이 아닌) 문자열의 시작 부분에 일치하는 항목이 있으면 출력의 첫 번째 요소는 '""이지만 문자열 끝 부분에 일치하는 항목이 있으면 출력이 제거된 항목과 동일합니다.

다음을 생성했습니다.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"   

dplyr/tidyverse 사용mutate_all와 함께str_trim전체 데이터 프레임을 트리밍합니다.

myDummy %>%
  mutate_all(str_trim)
library(tidyverse)
set.seed(335)
df <- mtcars %>%
        rownames_to_column("car") %>%
        mutate(car = ifelse(runif(nrow(mtcars)) > 0.4, car, paste0(car, " "))) %>%
        select(car, mpg)

print(head(df), quote = T)
#>                    car    mpg
#> 1         "Mazda RX4 " "21.0"
#> 2      "Mazda RX4 Wag" "21.0"
#> 3        "Datsun 710 " "22.8"
#> 4    "Hornet 4 Drive " "21.4"
#> 5 "Hornet Sportabout " "18.7"
#> 6           "Valiant " "18.1"

df_trim <- df %>%
  mutate_all(str_trim)

print(head(df_trim), quote = T)  
#>                   car    mpg
#> 1         "Mazda RX4"   "21"
#> 2     "Mazda RX4 Wag"   "21"
#> 3        "Datsun 710" "22.8"
#> 4    "Hornet 4 Drive" "21.4"
#> 5 "Hornet Sportabout" "18.7"
#> 6           "Valiant" "18.1"

2021-05-07 reprex 패키지에 의해 생성됨 (v0.3.0)

가장 좋은 방법은 트림()입니다.

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

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

다듬기를 해봤습니다.'\n'뿐만 아니라 공백에서도 잘 작동합니다.

x = '\n              Harden, J.\n              '

trim(x)
myDummy[myDummy$country == "Austria "] <- "Austria"

이 후에는 R이 다음을 인식하지 못하도록 해야 합니다."Austria "수평으로당신이 또한 가지고 있다고 가정해 봅시다."USA"그리고."Spain"레벨:

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

그것은 가장 높은 투표를 받은 응답보다 조금 덜 위협적이지만, 여전히 효과가 있을 것입니다.

이 스레드의 주요 접근 방식 벤치마킹.이것이 모든 이상한 사례를 포착하는 것은 아니지만, 지금까지 우리는 여전히 그러한 사례가 부족합니다.str_trim빈 공간을 제거합니다.trimws그렇지 않습니다( 답변에 대한 리처드 텔포드의 논평 참조).상관없어 보입니다 - gsub 옵션이 가장 빠른 것 같습니다 :)

x <- c(" lead", "trail ", " both ", " both and middle ", " _special")
## gsub function from https://stackoverflow.com/a/2261149/7941188 
## this is NOT the function from user Bernhard Kausler, which uses 
## a much less concise regex 
gsub_trim <- function (x) gsub("^\\s+|\\s+$", "", x)

res <- microbenchmark::microbenchmark(
  gsub = gsub_trim(x),
  ## https://stackoverflow.com/a/30210713/7941188
  trimws = trimws(x),
  ## https://stackoverflow.com/a/15007398/7941188
  str_trim = stringr::str_trim(x),
  times = 10^5
)
res
#> Unit: microseconds
#>      expr    min     lq      mean median       uq       max neval cld
#>      gsub 20.201 22.788  31.43943 24.654  28.4115  5303.741 1e+05 a  
#>    trimws 38.204 41.980  61.92218 44.420  51.1810 40363.860 1e+05  b 
#>  str_trim 88.672 92.347 116.59186 94.542 105.2800 13618.673 1e+05   c
ggplot2::autoplot(res)

sessionInfo()
#> R version 4.0.3 (2020-10-10)
#> Platform: x86_64-apple-darwin17.0 (64-bit)
#> Running under: macOS Big Sur 10.16
#> 
#> locale:
#> [1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8
#> 
#> attached base packages:
#> [1] stats     graphics  grDevices utils     datasets  methods   base     
#> 
#> loaded via a namespace (and not attached):
#>  stringr_1.4.0  

언급URL : https://stackoverflow.com/questions/2261079/how-can-i-trim-leading-and-trailing-white-space

반응형