วิธีลบช่องว่างทั้งหมดออกจากสตริงได้อย่างไร


คำตอบ:


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-specific ที่ตรงกับอักขระช่องว่างทั้งหมด \sเป็นนิพจน์ทั่วไปที่ไม่ขึ้นกับภาษาซึ่งทำสิ่งเดียวกัน


stringrวิธีการ: str_replace_allและstr_trim

stringrนำเสนอ wrappers ที่มนุษย์สามารถอ่านได้มากขึ้นรอบฟังก์ชัน R พื้นฐาน (แม้ว่า ณ เดือนธันวาคม 2014 รุ่นพัฒนาจะมีสาขาที่สร้างขึ้นด้านบน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_charclassและstri_trim

stringiถูกสร้างขึ้นบนไลบรารี ICU ที่ไม่ขึ้นกับแพลตฟอร์มและมีชุดฟังก์ชันการจัดการสตริงที่กว้างขวาง การเทียบเท่าด้านบนคือ:

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

นี่"\\p{WHITE_SPACE}"เป็นไวยากรณ์สำรองสำหรับชุดของ Unicode จุดรหัสถือว่าเป็นช่องว่างคิดเป็น"[[: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
@Aniko มีเหตุผลที่คุณใช้แก้ไข = TRUE หรือไม่
IRTFM

2
@DWin สมมติว่ามันเร็วกว่าถ้า R รู้ว่าไม่ต้องเรียกใช้นิพจน์ทั่วไป ในกรณีนี้มันไม่ได้สร้างความแตกต่างใด ๆ จริงๆฉันแค่อยู่ในนิสัยของการทำเช่นนั้น
Aniko

มีความแตกต่างระหว่าง"[[:space:]]"และ"\\s"?
Sacha Epskamp

5
หากคุณตรวจสอบflyordie.sin.khk.be/2011/05/04/day-35-replacing-charactersหรือเพียงแค่พิมพ์? regex คุณจะเห็นว่า [: space:] ใช้สำหรับ "อักขระช่องว่าง: ขึ้นบรรทัดใหม่ แท็บแนวตั้งฟีดฟอร์มการขึ้นบรรทัดใหม่และช่องว่าง " นั่นเป็นมากกว่าพื้นที่เพียงอย่างเดียว
Sir Ksilem

1
@Aniko หวังว่าคุณจะไม่สนใจการแก้ไขครั้งใหญ่ เนื่องจากคำถามนี้ได้รับความนิยมอย่างสูงจึงดูเหมือนคำตอบที่ต้องการให้ละเอียดยิ่งขึ้น
Richie Cotton

18

ฉันเพิ่งเรียนรู้เกี่ยวกับแพคเกจ "stringr" เพื่อลบ white space ออกจากจุดเริ่มต้นและจุดสิ้นสุดของสตริงด้วย str_trim (, side = "both") แต่มันก็มีฟังก์ชั่นการแทนที่ด้วย:

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:]]เพื่อจับคู่อักขระ white_space แนวนอนทุกชนิด

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


4

ฟังก์ชั่นstr_squish()จากแพ็คเกจstringrของ tidyverse นั้นมหัศจรรย์!

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

วิธีนี้คุณสามารถลบช่องว่างทั้งหมดออกจากตัวแปรอักขระทั้งหมดในกรอบข้อมูลของคุณ หากคุณต้องการที่จะเลือกเพียงบางส่วนของตัวแปรการใช้งานหรือmutatemutate_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. ลบการเติมช่องว่าง

    ห้องสมุด (stringr)

                2.         1.
                |          |
                V          V
    
        str_replace_all(str_trim(" xx yy 11 22  33 "), " ", "")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.