Как изменить кодировку имен столбцов на utf 8 в R - PullRequest
2 голосов

У меня есть кадр данных с русским языком colnames в UTF-8. Я выполняю линейное моделирование с помощью purrr и исследую coefficients с помощью broom::tidy(), затем получаю фрейм данных со смешанными кодировками имен столбцов, который я не могу передать girafe(), он завершается с ошибкой.

Я пытался использовать stringi::stri_enc_toutf8(colnames(df)): не помогает

`Кодировка (colnames (df)) <-« UTF-8 »не помогает </p>

rem %>% 
   group_by(МАГАЗИН, `ТИП МАГАЗИНА`, Дата) %>% 
   summarise(`Количество, шт` = sum(`Количество, шт`, na.rm = TRUE)) %>% 
   select(МАГАЗИН, `ТИП МАГАЗИНА`, `Количество, шт`, Дата) %>% 
   group_by(`ТИП МАГАЗИНА`, МАГАЗИН) %>% 
   nest() %>% 
   mutate(lm = map(data, ~lm(formula = `Количество, шт` ~ Дата, data = .x)),
          fit = map(lm, tidy)) %>% 
   unnest(fit) %>% 
   filter(term != "(Intercept)") %>% 
   colnames() %>% Encoding()
[1] "UTF-8"   "UTF-8"   "unknown" "unknown" "unknown" "unknown" "unknown"
> 

и чем, когда я это строю, я получаю это:

girafe_options(
   girafe( code = print(

     rem %>% 
       group_by(МАГАЗИН, `ТИП МАГАЗИНА`, Дата) %>% 
       summarise(`Количество, шт` = sum(`Количество, шт`, na.rm = TRUE)) %>% 
       select(МАГАЗИН, `ТИП МАГАЗИНА`, `Количество, шт`, Дата) %>% 
       group_by(`ТИП МАГАЗИНА`, МАГАЗИН) %>% 
       nest() %>% 
       mutate(lm = map(data, ~lm(formula = `Количество, шт` ~ Дата, data = .x)),
              fit = map(lm, tidy)) %>% 
       unnest(fit) %>% 
       filter(term != "(Intercept)") %>% 
       mutate(term = "Дата")  %>%
       ggplot(aes(x = reorder(МАГАЗИН, estimate), y = estimate,col = `ТИП МАГАЗИНА` , shape = `ТИП МАГАЗИНА` )) +
       geom_point_interactive(aes(tooltip = paste("Изменение: ", round(estimate, 6), "<br>",
                                                  "Среднеквадратическое отклонение: ", round(std.error, 6), "<br>",
                                                  "ВВероятность случайного изменения: ", round(p.value, 6)))) +
       geom_errorbar(aes(x = reorder(МАГАЗИН, estimate), ymin = estimate - (estimate + 1.96*std.error), 
                         ymax = estimate + (estimate + 1.96*std.error)))+
       geom_segment(aes(y = 0, yend = estimate, xend = МАГАЗИН)) +
       geom_hline(yintercept = 0, col = "black", size = 0.4, linetype = "dashed")+
       coord_flip() +
       theme_light() +
       theme(text = element_text(size = 16)) +
       theme(axis.text.x = element_text(angle = 90, vjust = 1)) +
       theme(legend.position='bottom', 
             legend.justification='left',
             legend.direction='horizontal')+
       labs(title = "Выручка и количество проданных товаров Реми и Экономыча",
            subtitle = "по номенклатуре",
            y = "",
            x = "Номенклатура")),height_svg = 2, width_svg = 16),opts_tooltip(use_fill = TRUE), opts_zoom(max = 5))


Error in doc_parse_file(con, encoding = encoding, as_html = as_html, options = options) : 
  Input is not proper UTF-8, indicate encoding !
Bytes: 0xC8 0xE7 0xEC 0xE5 [9]

в моделируемом наборе данных:



x <- seq.Date(as.Date("2010-01-01"), as.Date("2018-12-01"), "months")



y <- c(arima.sim(model = list(order = c(2,1,1), ar = c(1.5, -0.75), ma = 15), n = 107, sd = 15 ),
       arima.sim(model = list(order = c(2,1,1), ar = c(1.5, -.95), ma = 11), n = 107, sd = 15 ),
       arima.sim(model = list(order = c(4,0,1), ar = c(0.8, -.75, 0.6, 0.3), ma = 32), n = 108, sd = 10))


df <- data.frame(Дата = rep(x,3), y = y, Группа = c(rep("G1", 108), rep("G2", 108),rep("G3", 108)))


все работает просто отлично, но все кодировки одинаковы

stringi::stri_enc_mark(colnames(df))
[1] "native" "ASCII"  "native"

Как я могу изменить кодировку, чтобы я мог построить ее?

1 Ответ

2 голосов
/ 05 июля 2019

Я думаю, что мне удалось сузить ошибку: я не уверен, почему, но, похоже, проблема в кириллице в tooltip в geom_point_interactive(). Вот пример:

library(ggplot2)
library(ggiraph)

Sys.setlocale(locale = "Russian")
#> [1] "LC_COLLATE=Russian_Russia.1251;LC_CTYPE=Russian_Russia.1251;LC_MONETARY=Russian_Russia.1251;LC_NUMERIC=C;LC_TIME=Russian_Russia.1251"
set.seed(42)

x <- seq.Date(as.Date("2010-01-01"), as.Date("2018-12-01"), "months")

y <- c(
  arima.sim(model = list(order = c(2, 1, 1), ar = c(1.5, -0.75), ma = 15), n = 107, sd = 15),
  arima.sim(model = list(order = c(2, 1, 1), ar = c(1.5, -.95), ma = 11), n = 107, sd = 15),
  arima.sim(model = list(order = c(4, 0, 1), ar = c(0.8, -.75, 0.6, 0.3), ma = 32), n = 108, sd = 10)
)

df <- data.frame(Дата = rep(x, 3), y = y, Группа = rep(c("G1", "G2", "G3"), each = 108))

p <- ggplot(df, aes(Дата, y, colour = Группа)) + geom_line()
girafe(ggobj = p + geom_point_interactive(aes(tooltip = "Изменение")))
#> Error in doc_parse_file(con, encoding = encoding, as_html = as_html, options = options): Input is not proper UTF-8, indicate encoding !
#> Bytes: 0xC8 0xE7 0xEC 0xE5 [9]

Упаковка tooltip в enc2utf8() должна исправить это:

girafe(ggobj = p + geom_point_interactive(aes(tooltip = enc2utf8("Изменение"))))

Создано в 2019-07-05 пакетом представ. (v0.3.0.9000)

...