Bagaimana menghapus semua spasi putih dari string?

152

Jadi " xx yy 11 22 33 "akan menjadi "xxyy112233". Bagaimana saya bisa mencapai ini?

pengembara
sumber

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
Aniko
sumber
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"
Jolly Roger
sumber
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"
bartektartanus
sumber
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"
Avinash Raj
sumber
6
x = "xx yy 11 22 33"

gsub(" ", "", x)

> [1] "xxyy112233"
ZWL
sumber
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
damianooldoni
sumber
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)
NinaOtopal
sumber
-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 "), " ", "")
Data Jules
sumber