Böylece " xx yy 11 22 33 "olacak "xxyy112233". Bunu nasıl başarabilirim?
Yanıtlar:
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
gsubgsubbir 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_trimstringrtemel 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_trimstringiplatformdan 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
"[[:space:]]"ve "\\s"?
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"
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"
stringipaket CRAN'da şimdi, keyfini çıkarın! :)
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.
[[:blank:]]Her tür yatay white_space karakteriyle eşleştirmek için kullanın .
gsub("[[:blank:]]", "", " xx yy 11 22 33 ")
# [1] "xxyy112233"
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
str_squishtüm boşlukları kaldırmaz. Sadece bir yerine birden fazla alanı düzeltir ve değiştirir.
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)
Stringr kütüphanesinden şunu deneyebilirsiniz:
Boş doldurmayı kaldır
kitaplık (stringr)
2. 1.
| |
V V
str_replace_all(str_trim(" xx yy 11 22 33 "), " ", "")