#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 <-
в начало вашей цепочки dplyr4. Спасибо! Решение «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.