Символ с кодом 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"