Làm thế nào để loại bỏ tất cả khoảng trắng từ một chuỗi?


Câu trả lời:


258

Nói chung, chúng tôi muốn một giải pháp được véc tơ hóa, vì vậy đây là một ví dụ thử nghiệm tốt hơn:

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

Cách tiếp cận cơ sở R: gsub

gsubthay thế tất cả các phiên bản của một chuỗi ( fixed = TRUE) hoặc biểu thức chính quy ( fixed = FALSE, mặc định) bằng một chuỗi khác. Để xóa tất cả các khoảng trắng, sử dụng:

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

Như DWin đã lưu ý, trong trường hợp fixed = TRUEnày là không cần thiết nhưng cung cấp hiệu suất tốt hơn một chút vì khớp chuỗi cố định nhanh hơn so với khớp biểu thức thông thường.

Nếu bạn muốn xóa tất cả các loại khoảng trắng, hãy sử dụng:

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:]"là một nhóm biểu thức chính quy dành riêng cho R khớp với tất cả các ký tự khoảng trắng. \slà một biểu thức chính quy độc lập với ngôn ngữ cũng làm điều tương tự.


Cách stringrtiếp cận: str_replace_allstr_trim

stringrcung cấp nhiều trình bao bọc dễ đọc hơn cho con người xung quanh các hàm R cơ sở (mặc dù kể từ tháng 12 năm 2014, phiên bản phát triển có một nhánh được xây dựng trên đầu trang stringi, được đề cập bên dưới). Tương đương của các lệnh trên, sử dụng [ str_replace_all][3], là:

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

stringrcũng có một str_trimchức năng chỉ loại bỏ khoảng trắng hàng đầu và dấu.

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      

Cách stringitiếp cận: stri_replace_all_charclassstri_trim

stringiđược xây dựng dựa trên thư viện ICU độc lập với nền tảng và có một bộ các hàm thao tác chuỗi mở rộng. Các khoản tương đương của các bên trên là:

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

Dưới đây "\\p{WHITE_SPACE}"là một cú pháp thay thế cho tập hợp các điểm mã Unicode coi là khoảng trắng, tương đương với "[[:space:]]", "\\s"space(). Đối với thay thế biểu thức chính quy phức tạp hơn, cũng có stri_replace_all_regex.

stringicũng có chức năng cắt .

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
@Aniko. Có một lý do bạn sử dụng cố định = TRUE?
IRTFM

2
@DWin Giả sử sẽ nhanh hơn nếu R biết rằng nó không phải gọi các công cụ biểu thức chính quy. Trong trường hợp này nó không thực sự làm cho bất kỳ sự khác biệt, tôi chỉ là trong thói quen làm như vậy.
Aniko

Có sự khác biệt giữa "[[:space:]]""\\s"?
Sacha Epskamp

5
nếu bạn kiểm tra flyordie.sin.khk.be/2011/05/04/day-35-replaces-char character hoặc chỉ cần nhập? regex thì bạn sẽ thấy rằng [: space:] được sử dụng cho "Space character: tab, newline , tab dọc, thức ăn mẫu, trả lại xe và không gian. " Đó là nhiều hơn không gian một mình
Ngài Ksilem

1
@Aniko Hy vọng bạn không bận tâm về chỉnh sửa lớn. Vì câu hỏi này rất phổ biến, có vẻ như câu trả lời cần phải kỹ lưỡng hơn.
Bông Richie

18

Tôi mới tìm hiểu về gói "stringr" để xóa khoảng trắng từ đầu và cuối chuỗi bằng str_trim (, side = "cả hai") nhưng nó cũng có chức năng thay thế sao cho:

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

[1] "xxyy112233"

3
gói Stringr không hoạt động tốt với mọi mã hóa. gói Stringi là giải pháp tốt hơn, để biết thêm thông tin, hãy kiểm tra github.com/Rexamine/opesi
bartektartanus

8

Xin lưu ý rằng các linh hồn được viết ở trên chỉ loại bỏ không gian. Nếu bạn cũng muốn xóa tab hoặc sử dụng dòng mới stri_replace_all_charclasskhỏi stringigói.

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

4
stringiGói trên CRAN bây giờ, hãy tận hưởng! :)
bartektartanus 15/03/2016

1
Lệnh này ở trên không chính xác. Cách đúng là stri numplace_all_char class ("ala \ t ma \ n kota", "\\ p {WHITEinksACE}", "")
Lucas Fortini

5
Sau khi sử dụng stringimột vài tháng nay và thấy / học được nó mạnh mẽ và hiệu quả như thế nào, nó đã trở thành gói đi kèm của tôi cho các hoạt động chuỗi. Các bạn đã làm một công việc tuyệt vời với nó.
Rich Scriven

7

Sử dụng [[:blank:]]để khớp với bất kỳ loại ký tự trắng ngang nào.

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

6
x = "xx yy 11 22 33"

gsub(" ", "", x)

> [1] "xxyy112233"

4

Các chức năng str_squish()từ gói stringrcủa tidyverse làm phép thuật!

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
Xin vui lòng không liên kết đến mã. Thêm nó vào phần thân văn bản của câu trả lời của bạn và giải thích nó ở đây, để cho câu trả lời của bạn có giá trị lâu dài hơn.
R Balasubramanian

Cảm ơn @RBalasubramanian đã nhắc nhở tôi về hướng dẫn này. Tôi sẽ theo nó trong tương lai.
damianooldoni

Tôi không thấy cách này trả lời câu hỏi. str_squishkhông loại bỏ tất cả các không gian. Nó chỉ cắt và thay thế nhiều không gian cho một.
Cây tầm ma

0

Bằng cách này, bạn có thể xóa tất cả khoảng trắng khỏi tất cả các biến ký tự trong khung dữ liệu của mình. Nếu bạn chỉ muốn chọn một số biến, hãy sử dụng mutatehoặc 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

Từ thư viện Stringr bạn có thể thử điều này:

  1. Xóa khoảng trống điền liên tiếp
  2. Xóa điền

    thư viện (chuỗi)

                2.         1.
                |          |
                V          V
    
        str_replace_all(str_trim(" xx yy 11 22  33 "), " ", "")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.