Как обрезать пробелы, когда триммеры не работают? - PullRequest
2 голосов
/ 27 июня 2019

Я привык использовать trimws, чтобы избавиться от пробелов в тексте.

Теперь у меня есть df, который был сделан из списанных данных.

У меня есть 2 столбца, которые относятся к деньгам, но являются векторами chr, потому что они были вырезаны из сети, как упоминалось ранее. К одному столбцу я могу без проблем применить trimws, но к другому.

str(lacuracao_tvs$precio_actual[1])
chr " 1199.00"

Почему?

new_precio_actual <- trimws(lacuracao_tvs$precio_actual[1])

dput(new_precio_actual)
" 1199.00"

trimws работает в precio_antes, но не в precio_actual:

> str(lacuracao_tvs)
'data.frame':   100 obs. of  4 variables:
 $ ecommerce    : chr  "la-curacao" "la-curacao" "la-curacao" "la-curacao" ...
 $ producto     : chr  "TV LED AOC Ultra HD Smart 50\" LE50U7970" "TV Samsung Ultra HD 4K Smart 58\" UN-58RU7100G" "TV LG Ultra HD 4K Smart AI 55\" 55UK6200" "TV AOC Ultra HD 4K Smart 55\" 55U6285" ...
 $ precio_antes : chr  "1899.00" "1899.00" "1899.00" "1899.00" ...
 $ precio_actual: chr  " 1199.00" " 1199.00" " 1199.00" " 1199.00" ...

SessionInfo:

Sys.info()
          sysname           release           version          nodename 
        "Windows"          "10 x64"     "build 17763" "DESKTOP-MNDUKBD" 
          machine             login              user    effective_user 
         "x86-64"       "OGONZALES"       "OGONZALES"       "OGONZALES" 
> sessionInfo(package = NULL)
R version 3.5.2 (2018-12-20)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 17763)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] dplyr_0.7.8     rvest_0.3.2     xml2_1.2.0      RSelenium_1.7.5

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.0       rstudioapi_0.9.0 bindr_0.1.1      magrittr_1.5    
 [5] rappdirs_0.3.1   tidyselect_0.2.5 R6_2.3.0         rlang_0.3.1     
 [9] stringr_1.3.1    httr_1.4.0       caTools_1.17.1.1 tools_3.5.2     
[13] binman_0.1.1     selectr_0.4-1    semver_0.2.0     subprocess_0.8.3
[17] yaml_2.2.0       openssl_1.1      assertthat_0.2.0 tibble_2.0.1    
[21] crayon_1.3.4     bindrcpp_0.2.2   purrr_0.2.5      bitops_1.0-6    
[25] curl_3.3         glue_1.3.0       wdman_0.2.4      stringi_1.2.4   
[29] compiler_3.5.2   pillar_1.3.1     XML_3.98-1.20    jsonlite_1.6    
[33] pkgconfig_2.0.2

ОБНОВЛЕНИЕ 1:

utf8ToInt(lacuracao_tvs$precio_actual[1])
[1] 160  49  49  57  57  46  48  48

Ответы [ 2 ]

7 голосов
/ 27 июня 2019

Символ с кодом ASCII 160 называется «неразрывный пробел». Об этом можно прочитать в Википедии:

https://en.wikipedia.org/wiki/Non-breaking_space

trimws() функция не включает его всписок символов, которые удаляются функцией:

x <- intToUtf8(c(160,49,49,57,57,46,48,48))
x
#[1] " 1199.00"

trimws(x)
#[1] " 1199.00"

Один из способов избавиться от нее - использовать функцию str_trim() из stringr library:

library(stringr)
y <- str_trim(x)
trimws(y)
[1] "1199.00"

Другой способ - сначала применить функцию iconv():

y <- iconv(x, from = 'UTF-8', to = 'ASCII//TRANSLIT')
trimws(y)
#[1] "1199.00"

ОБНОВЛЕНИЕ Чтобы объяснить, почему trimws () не удаляет описанный выше символ «невидимка» и stringr: str_trim ()делает.

Вот что мы читаем из справки trimws():

Для переносимости, «пробел» берется как класс символов [\ t \ r \ n] (пробел, горизонтальныйтабуляция, перевод строки, возврат каретки)

Для stringr:str_trim() в самой теме справки не указано, что считать «пробелом», но если вы посмотрите на справку для stri_trim_both, которая вызываетсяstr_trim() вы увидите: stri_trim_both(str, pattern = "\\P{Wspace}") В основном в этом случае используется более широкий диапазон символов, которые рассматриваются как пробелы.

ОБНОВЛЕНИЕ 2

Как отметил @ H1, версия 3.6.0 предоставляет возможность указать, что считать символом пробела:

Внутренне, 'sub (re, ", *, perl = TRUE)', т.е.Используются регулярные выражения библиотеки PCRE.Для переносимости по умолчанию «пробелами» является класс символов «[\ t \ r \ n]» (пробел, горизонтальная табуляция, возврат каретки, перевод строки).В качестве альтернативы, '[\ h \ v]' является хорошим (PCRE) обобщением для соответствия всем горизонтальным и вертикальным пробельным символам Юникода, см. Также https://www.pcre.org>.

Так что, если вы используете версию 3.6.0 или новееВы можете просто сделать:

> trimws(x,whitespace = "[\\h\\v]")
#[1] "1199.00"
1 голос
/ 27 июня 2019

Начиная с версии R 3.6.0 trimws() имеет аргумент, позволяющий определить, что считается пробелом, который в данном случае является пробелом без перерывов.

trimws(x, whitespace = "\u00A0|\\s")
[1] "1199.00"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...