선행 및 후행 공백을 어떻게 잘라낼 수 있습니까?
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"
매칭이 안 됩니다.
- 문제를 인식할 수 있도록 화면의 공백을 '보여주는' 좋은 방법이 있습니까?
- 그리고 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
'programing' 카테고리의 다른 글
내포된 함수가 외부 함수의 변수에 액세스할 수 있지만 수정할 수 없는 이유 (0) | 2023.08.06 |
---|---|
Excel VBA 필터링/가시 셀 (0) | 2023.08.06 |
jdiv 태그 내부에 이미지 추가 쿼리 (0) | 2023.08.06 |
docker-compose.yml에서 명명된 볼륨의 호스트 경로를 설정하는 방법 (0) | 2023.08.06 |
윈도우 기능이 있는 SQL 쿼리에서 그룹화할 수 있습니까? (0) | 2023.08.06 |