Bagaimana menghapus semua spasi putih dari string?


Jawaban:


258

Secara umum, kami menginginkan solusi yang di-vectorised, jadi inilah contoh pengujian yang lebih baik:

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

Pendekatan dasar R: gsub

gsubmengganti semua instance string ( fixed = TRUE) atau ekspresi reguler ( fixed = FALSE, default) dengan string lain. Untuk menghapus semua spasi, gunakan:

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

Seperti yang dicatat DWin, dalam hal fixed = TRUEini tidak perlu tetapi memberikan kinerja yang sedikit lebih baik karena pencocokan string tetap lebih cepat daripada pencocokan ekspresi reguler.

Jika Anda ingin menghapus semua jenis spasi, gunakan:

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:]"adalah grup ekspresi reguler spesifik R yang cocok dengan semua karakter ruang. \sadalah ekspresi reguler independen-bahasa yang melakukan hal yang sama.


The stringrpendekatan: str_replace_alldanstr_trim

stringrmenyediakan lebih banyak pembungkus yang dapat dibaca manusia di sekitar fungsi dasar R (meskipun pada Desember 2014, versi pengembangan memiliki cabang yang dibangun di atas stringi, yang disebutkan di bawah). Setara dengan perintah di atas, menggunakan [ str_replace_all][3], adalah:

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

stringrjuga memiliki str_trimfungsi yang hanya menghilangkan spasi putih depan dan belakang.

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      

The stringipendekatan: stri_replace_all_charclassdanstri_trim

stringidibangun di atas pustaka ICU platform-independen , dan memiliki serangkaian fungsi manipulasi string. The setara di atas adalah:

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

Berikut "\\p{WHITE_SPACE}"ini adalah sintaks alternatif untuk set poin kode Unicode yang dianggap sebagai spasi putih, setara dengan "[[:space:]]", "\\s"dan space(). Untuk penggantian ekspresi reguler yang lebih kompleks, ada juga stri_replace_all_regex.

stringijuga memiliki fungsi trim .

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. Apakah ada alasan Anda menggunakan fixed = TRUE?
— IRTFM

2
@DWin Seharusnya lebih cepat jika R tahu bahwa itu tidak harus memanggil hal-hal ekspresi reguler. Dalam hal ini tidak benar-benar membuat perbedaan, saya hanya terbiasa melakukannya.
— Aniko

Apakah ada perbedaan antara "[[:space:]]"dan "\\s"?
— Sacha Epskamp

5
jika Anda memeriksa flyordie.sin.khk.be/2011/05/04/day-35-replacing-characters atau cukup ketik? regex maka Anda melihat bahwa [: spasi:] digunakan untuk "Karakter spasi: tab, baris baru , tab vertikal, umpan form, carriage return, dan spasi. " Itu jauh lebih dari ruang saja
— Sir Ksilem

1
@Aniko Harap Anda tidak keberatan dengan hasil edit yang besar. Karena pertanyaan ini sangat populer, sepertinya jawaban yang dibutuhkan lebih teliti.
— Richie Cotton

18

Saya baru saja belajar tentang paket "stringr" untuk menghilangkan spasi putih dari awal dan akhir string dengan str_trim (, side = "both") tetapi juga memiliki fungsi penggantian sehingga:

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

[1] "xxyy112233"

3
Paket stringr tidak bekerja dengan baik dengan setiap encoding. paket stringi adalah solusi yang lebih baik, untuk info lebih lanjut periksa github.com/Rexamine/stringi
— bartektartanus

8

Harap dicatat bahwa soulions yang ditulis di atas hanya menghilangkan ruang. Jika Anda ingin juga menghapus tab atau penggunaan baris baru stri_replace_all_charclassdari stringipaket.

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

4
stringipaket ada di CRAN sekarang, selamat menikmati! :)
— bartektartanus

1
Perintah di atas tidak benar. Cara yang benar adalah stri_replace_all_charclass ("ala \ t ma \ n kota", "\\ p {WHITE_SPACE}", "")
— Lucas Fortini

5
Setelah menggunakan stringiselama beberapa bulan sekarang dan melihat / belajar betapa kuat dan efisiennya, itu telah menjadi paket masuk saya untuk operasi string. Kalian melakukan pekerjaan yang luar biasa dengannya.
— Rich Scriven

7

Gunakan [[:blank:]]untuk mencocokkan segala jenis karakter white_space horisontal.

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

6
x = "xx yy 11 22 33"

gsub(" ", "", x)

> [1] "xxyy112233"

4

Fungsi str_squish()dari paket stringrTidyverse melakukan keajaiban!

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
Tolong jangan menautkan ke kode. Tambahkan di badan teks jawaban Anda dan jelaskan di sini, untuk memberikan jawaban Anda nilai yang lebih panjang.
— R Balasubramanian

Terima kasih @RBalasubramanian karena mengingatkan saya pada pedoman ini. Saya akan mengikutinya di masa depan.
— damianooldoni

Saya tidak melihat bagaimana ini menjawab pertanyaan. str_squishtidak menghapus semua spasi. Itu hanya memotong dan mengganti beberapa ruang untuk satu.
— Jelatang

0

Dengan cara ini Anda bisa menghapus semua spasi dari semua variabel karakter dalam bingkai data Anda. Jika Anda lebih suka memilih hanya beberapa variabel, gunakan mutateatau 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

Dari perpustakaan stringr Anda dapat mencoba ini:

  1. Hapus kosongkan berturut-turut
  2. Hapus isi kosong

    perpustakaan (stringr)

                2.         1.
                |          |
                V          V
    
        str_replace_all(str_trim(" xx yy 11 22  33 "), " ", "")
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.