Bir dizeden tüm boşluklar nasıl kaldırılır?


Yanıtlar:


266

Genel olarak vektörleştirilmiş bir çözüm istiyoruz, bu yüzden işte daha iyi bir test örneği:

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

Temel R yaklaşımı: gsub

gsubbir dizenin ( fixed = TRUE) veya normal ifadenin ( fixed = FALSEvarsayılan) tüm örneklerini başka bir dizeyle değiştirir. Tüm boşlukları kaldırmak için şunu kullanın:

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

DWin'in belirttiği gibi, bu durumda fixed = TRUEgerekli değildir, ancak sabit bir dizeyi eşleştirmek normal bir ifadeyle eşleşmekten daha hızlı olduğundan biraz daha iyi performans sağlar.

Tüm beyaz boşluk türlerini kaldırmak istiyorsanız, şunu kullanın:

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:]"tüm boşluk karakterleriyle eşleşen R'ye özgü bir normal ifade grubudur. \saynı şeyi yapan, dilden bağımsız bir normal ifadedir.


stringrYaklaşım: str_replace_allvestr_trim

stringrtemel R işlevlerinin etrafında daha fazla insan tarafından okunabilir sarmalayıcı sağlar (Aralık 2014 itibarıyla geliştirme sürümünün, stringiaşağıda belirtilenin üzerine inşa edilmiş bir dalı vardır ). Yukarıdaki komutların [kullanan eşdeğerleri str_replace_all][3]şunlardır:

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

stringrayrıca str_trimyalnızca baştaki ve sondaki boşlukları kaldıran bir işlevi vardır.

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      

stringiYaklaşım: stri_replace_all_charclassvestri_trim

stringiplatformdan bağımsız ICU kitaplığı üzerine inşa edilmiştir ve kapsamlı bir dizi işleme işlevine sahiptir. Yukarıdakilerin eşdeğerleri şunlardır:

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

"\\p{WHITE_SPACE}"Boşluk olarak kabul edilen Unicode kod noktaları kümesi için "[[:space:]]", "\\s"ve ile eşdeğer olan alternatif bir sözdizimi aşağıda verilmiştir space(). Daha karmaşık düzenli ifade değiştirmeleri için de var stri_replace_all_regex.

stringiayrıca trim işlevlerine sahiptir .

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. Sabit = DOĞRU kullanmanızın bir nedeni var mı?
IRTFM

2
@DWin Sözde, eğer R normal ifadeleri çağırmak zorunda olmadığını bilirse daha hızlıdır. Bu durumda gerçekten bir fark yaratmıyor, ben sadece bunu yapma alışkanlığım var.
Aniko

Arasında bir fark var mı "[[:space:]]"ve "\\s"?
Sacha Epskamp

5
flyordie.sin.khk.be/2011/05/04/day-35-replacing-characters'ı kontrol ederseniz veya sadece? regex yazarsanız, [: space:] "Boşluk karakterleri: sekme, yeni satır , dikey sekme, form besleme, satır başı ve boşluk. " Bu sadece uzaydan çok daha fazlası
Sir Ksilem

1
@Aniko Umarım büyük düzenlemeyi önemsemezsiniz. Bu soru oldukça popüler olduğu için, cevabın daha kapsamlı olması gerekiyormuş gibi görünüyordu.
Richie Cotton

19

Str_trim (, side = "both") ile bir dizenin başından ve sonundan beyaz boşluğu kaldırmak için "stringr" paketini yeni öğrendim, ancak aynı zamanda bir değiştirme işlevi de var, böylece:

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

[1] "xxyy112233"

3
stringr paketi her kodlamayla iyi çalışmaz. stringi paketi daha iyi bir çözüm, daha fazla bilgi için github.com/Rexamine/stringi'yi
bartektartanus

8

Lütfen yukarıda yazılan ifadelerin yalnızca boşluğu kaldırdığını unutmayın. İsterseniz de sekme veya yeni hat kullanımını kaldırmak için stri_replace_all_charclassgelen stringipaketin.

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

4
stringipaket CRAN'da şimdi, keyfini çıkarın! :)
bartektartanus

1
Yukarıdaki bu komut yanlıştır. Doğru yol stri_replace_all_charclass ("ala \ t ma \ n kota", "\\ p {WHITE_SPACE}", "")
Lucas Fortini

5
stringiBirkaç aydır kullandıktan ve ne kadar güçlü ve verimli olduğunu gördükten / öğrendikten sonra, string işlemleri için benim vazgeçilmez paketim haline geldi. Onunla harika bir iş çıkardınız.
Rich Scriven

8

[[:blank:]]Her tür yatay white_space karakteriyle eşleştirmek için kullanın .

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

7
x = "xx yy 11 22 33"

gsub(" ", "", x)

> [1] "xxyy112233"

4

Tidyverse str_squish()paketinin işlevi stringrsihir yapar!

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
Lütfen koda bağlanmayın. Cevabınıza daha uzun vadeli bir değer vermek için, cevabınızın metin gövdesine ekleyin ve burada açıklayın.
R Balasubramanian

Bana bu kılavuzu hatırlattığınız için @RBalasubramanian'a teşekkürler. Gelecekte onu takip edeceğim.
damianooldoni

Bunun soruyu nasıl yanıtladığını anlamıyorum. str_squishtüm boşlukları kaldırmaz. Sadece bir yerine birden fazla alanı düzeltir ve değiştirir.
Isırgan

0

Bu şekilde, veri çerçevenizdeki tüm karakter değişkenlerinden tüm boşlukları kaldırabilirsiniz. Değişkenlerden sadece bazılarını seçmeyi tercih ederseniz, mutateveya kullanın 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)


0

Başka bir yaklaşım dikkate alınabilir

library(stringr)
str_replace_all(" xx yy 11 22  33 ", regex("\\s*"), "")

#[1] "xxyy112233"

\\ s : Boşluk, sekme, dikey sekme, satırsonu, form besleme, satır başı ile eşleşir

*: En az 0 kez eşleşir


-1

Stringr kütüphanesinden şunu deneyebilirsiniz:

  1. Ardışık doldurma boşluklarını kaldırın
  2. Boş doldurmayı kaldır

    kitaplık (stringr)

                2.         1.
                |          |
                V          V
    
        str_replace_all(str_trim(" xx yy 11 22  33 "), " ", "")
    
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.