функция mutate выдает неожиданные результаты для числового столбца в таблице (huxtable), но не в фрейме данных

#r #dplyr

#r #dplyr

Вопрос:

Я пытаюсь научиться создавать красивые таблицы с помощью пакета huxtable . Это кривая обучения, но пока я действительно впечатлен. Однако я столкнулся с несколькими проблемами, которые, похоже, не могу решить.

Во-первых, я пытаюсь отформатировать числа так, чтобы для позиции тысяч был разделитель-запятая (используя mutate_at функцию из dplyr пакета, и prettyNum . Это работает хорошо, за исключением того, что для столбцов с классом numeric внутренние нули удаляются (например, 1001 становится 1,1 вместо желаемого 1,001). Если класс col является целым числом, то создается желаемый результат. Кроме того, правильный вывод создается, если входные данные представляют собой dataframe, а не huxtable, независимо от того, является ли столбец числовым или целочисленным.

Во-вторых, когда я добавляю другое форматирование таблицы (в частности, заголовок), заголовок, похоже, не переносится при записи таблицы в файл Word. Кроме того, создается примечание:

Note: zip::zip() is deprecated, please use zip::zipr() instead

Ниже приведен пример кода, который, я думаю, иллюстрирует проблему.

Мои вопросы:

1) Почему функция mutate выдает нечетный результат для числового столбца в huxtables, но не в фреймах данных, и как я могу убедиться, что она работает? Я мог бы, конечно, выполнить форматирование чисел перед преобразованием фрейма данных в таблицу, но я все равно хотел бы знать, что здесь происходит.

2) Почему форматирование таблицы не сохраняется в выходном файле?

3) Что означает примечание об использовании zipr , и может ли эта проблема, на которую он ссылается, также быть причиной сбоя при экспорте свойств таблицы?

Спасибо, Гленн

 library(dplyr)
library(flextable)
library(huxtable)

test=data.frame(var1=1918:1925,var2=c(9009,1000:1006),var3 = 1100:1107)
str(test)
HUX <- hux(test)
number_format(HUX)
number_format(HUX[,2]) <- 0
# works as expected on data frame
mutate_at(test,-1,.funs=list(~prettyNum(.,big.mark=",")))
# does not work as expected on huxtable, for var2 of class numeric
mutate_at(HUX,-1,.funs=list(~prettyNum(., big.mark=",")))

# add caption, borders, and colnames
set_caption(HUX,"Example table") %>%
set_caption_pos("topleft") %>%
set_top_border(1,,1) %>%
set_bottom_border(final(1), , 1)    %>%
add_colnames()

# write out the table (this produces a note about zipr)
quick_docx(HUX)            

  

Комментарии:

1. См. Примечание об использовании zipr github.com/awalker89/openxlsx/issues/454

2. Re mutate_at : huxtable не реализует этот метод — он только реализует mutate — поэтому, если mutate_at сам не вызывает mutate , поэтому он не будет работать. Но на самом деле, что вы подразумеваете под «работает не так, как ожидалось»? Для меня это выглядит нормально.

3. Наконец, ваша вторая проблема имеет простое решение: вы меняете все функции HUX , но не сохраняете результат обратно в исходную переменную. Помните, что R — функциональный язык, объекты очень редко изменяются на месте. Добавьте HUX <- в начало вашей цепочки dplyr

4. Спасибо! Решение «number_format» отлично работает. Заголовок по-прежнему не отображается с помощью quick_docx(HUX), но он появляется с помощью quick_pdf(HUX). В любом случае, я, вероятно, буду использовать pdf большую часть времени. Интересно, однако, что настройка ширины столбца, похоже, работает с quick_docx, но не с quick_pdf, но я опубликую еще один вопрос по этому вопросу.

5. Посмотрите ?as_flextable , какие функции не поддерживает преобразование Word…

Ответ №1:

Прочитайте примечание об использовании zipr: см. https://github.com/awalker89/openxlsx/issues/454

Re mutate_at : ваши данные преобразуются правильно, но huxtable отображает их неправильно. Он распознает каждое число до и после запятой как отдельное. (Распознавание чисел сложно, давайте пройдемся по магазинам …) Я бы предложил использовать number_format вместо прямого преобразования данных:

 number_format(HUX)[,2:3] <- list(function(x) prettyNum(x, big.mark=",")) 
  

Наконец, ваша вторая проблема имеет простое решение: вы меняете все функции HUX , но не сохраняете результат обратно в исходную переменную. Помните, что R — функциональный язык, объекты очень редко изменяются на месте. Добавьте HUX <- в начало вашей цепочки dplyr.