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
gsub
gsub
bir dizenin ( fixed = TRUE
) veya normal ifadenin ( fixed = FALSE
varsayı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 = TRUE
gerekli 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. \s
aynı şeyi yapan, dilden bağımsız bir normal ifadedir.
stringr
Yaklaşım: str_replace_all
vestr_trim
stringr
temel 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, stringi
aş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(), "")
stringr
ayrıca str_trim
yalnı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
stringi
Yaklaşım: stri_replace_all_charclass
vestri_trim
stringi
platformdan 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
.
stringi
ayrı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_charclass
gelen stringi
paketin.
library(stringi)
stri_replace_all_charclass(" ala \t ma \n kota ", "\\p{WHITE_SPACE}", "")
## [1] "alamakota"
stringi
paket CRAN'da şimdi, keyfini çıkarın! :)
stringi
Birkaç 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 stringr
sihir 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_squish
tü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, mutate
veya 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 "), " ", "")