R read.table с файлом в кодировке UTF-8 читает символ бесконечности как 8 (int) - PullRequest
0 голосов
/ 04 февраля 2019

Я читаю в файле данных в кодировке UTF-8, используя read.table.При использовании опции 'encoding = "UTF-8" любые символы бесконечности читаются как число 8.

Для чего стоит эта строка:

read.table(file.path(workingDir, "datafile.csv"), sep=",", blank.lines.skip=TRUE, allowEscapes=FALSE, header=TRUE, encoding="UTF-8")

Фрагмент файла:

enter image description here

Все остальные значения прочитаны правильно, поэтому я в растерянности.Есть идеи?

1 Ответ

0 голосов
/ 07 февраля 2019

Это ошибка кодирования в R в Windows, как вы уже сообщили о r-devel .

В качестве обходного пути вы можете сделать следующее:

Чтениеваши данные с помощью {readr} (из-за ошибки вы не можете использовать буквенный символ бесконечности в R, но вместо этого вы должны использовать escape-код Unicode \u221E).

library(readr)
(xdf <- read_csv("x, y\n\u221E, 2", col_types = cols(.default = col_character())))
#> # A tibble: 1 x 2
#>   x     y    
#>   <chr> <chr>
#> 1 ∞     2

Здесь мы читаем во всех столбцахкак символ (а не числовой), потому что мы должны заменить символ бесконечности на Inf позже.Подробнее о том, как указать тип столбца, см. help(readr::cols()).

Теперь замените символ бесконечности зарезервированным словом бесконечности в R, Inf и преобразуйте его в числовой.Я использую str_replace() из {stringr} здесь, но это должно работать и с base::gsub().

library(stringr) 
as.numeric(str_replace(xdf$x, pattern= "\u221E", replacement = "Inf"))
#> [1] Inf

Если вы хотите сделать это для всех столбцов в вашем data.frame, вы можетесделать это, например, с помощью функции mutate_all из dplyr.

library(dplyr)
mutate_all(xdf, str_replace, pattern= "\u221E", replacement = "Inf") %>% 
  mutate_all(as.numeric)
#> # A tibble: 1 x 2
#>       x     y
#>   <dbl> <dbl>
#> 1   Inf     2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...