Используйте XLSX и addDataFrame() для получения правильных имен заголовков

#r #list #dataframe #xlsx

Вопрос:

Список фреймов данных, экспортированных в Excel, содержит имя DF

Я разбиваю фрейм данных по городам, и результирующий список фреймов данных экспортируется на их собственные листы Excel, но заголовок каждого фрейма данных нежелательно выводится как Atlanta.type и Atlanta.kpi вместо type и kpi . Я хотел бы понять, почему это происходит и как я могу это исправить, чтобы удовлетворить свои потребности. Мой желаемый результат должен выглядеть так (но это не так):

Хороший заголовок И хорошие данные!!!

Подробный Пример

Установка

Вот базовый фрейм данных, аналогичный тому, что есть в реальной жизни, и я разделю его по местоположению на список:

 library(tidyverse)

df_Main <- expand_grid(location = c("New York", "Boston", "Atlanta"),
                  type = c("A"), 
                  kpi = c(1.5,3))

> df_Main
# A tibble: 6 x 3
  location type    kpi
  <chr>    <chr> <dbl>
1 New York A       1.5
2 New York A       3  
3 Boston   A       1.5
4 Boston   A       3  
5 Atlanta  A       1.5
6 Atlanta  A       3  
 

Теперь разделите его на список фреймов данных, по одному для каждого листа, который я создам:

 lst_Main <- split(df_Main, f = df_Main$location)

> lst_Main
$Atlanta
# A tibble: 2 x 3
  location type    kpi
  <chr>    <chr> <dbl>
1 Atlanta  A       1.5
2 Atlanta  A       3  

$Boston
# A tibble: 2 x 3
  location type    kpi
  <chr>    <chr> <dbl>
1 Boston   A       1.5
2 Boston   A       3  


 #r #list #dataframe #xlsx



Вопрос:

Список фреймов данных, экспортированных в Excel, содержит имя DF

Я разбиваю фрейм данных по городам, и результирующий список фреймов данных экспортируется на их собственные листы Excel, но заголовок каждого фрейма данных нежелательно выводится как Atlanta.type и Atlanta.kpi вместо type и kpi . Я хотел бы понять, почему это происходит и как я могу это исправить, чтобы удовлетворить свои потребности. Мой желаемый результат должен выглядеть так (но это не так): Хороший заголовок И хорошие данные!!!

Подробный Пример

Установка

Вот базовый фрейм данных, аналогичный тому, что есть в реальной жизни, и я разделю его по местоположению на список:
 library(tidyverse)

df_Main <- expand_grid(location = c("New York", "Boston", "Atlanta"),
                  type = c("A"), 
                  kpi = c(1.5,3))

> df_Main
# A tibble: 6 x 3
  location type    kpi
  <chr>    <chr> <dbl>
1 New York A       1.5
2 New York A       3  
3 Boston   A       1.5
4 Boston   A       3  
5 Atlanta  A       1.5
6 Atlanta  A       3  
 

Теперь разделите его на список фреймов данных, по одному для каждого листа, который я создам:

New York`
# A tibble: 2 x 3
location type kpi
<chr> <chr> <dbl>
1 New York A 1.5
2 New York A 3

Испытание 1

Я помещаю список в рабочую книгу с помощью library(xlsx) , и, хотя это работает, имена столбцов в результирующем файле Excel показывают Atlanta.type Atlanta.kpi имена столбцов и:

 library(xlsx)

wb = createWorkbook()

for (df in names(lst_Main)) {
  sheet = createSheet(wb, df)
  addDataFrame(lst_Main[df], sheet = sheet, col.names = TRUE, row.names = FALSE)
}

saveWorkbook(wb, file = "./Excel Output/test.xlsx")
 

Плохое название заголовка-не хотите, чтобы добавленный город!

Испытание 2

Я подумал, что, возможно, это потому, что я не поставил двойную скобку в списке, поэтому я альтернативно попытался:

 for (df in names(lst_Main)) {
  sheet = createSheet(wb, df)
  addDataFrame(lst_Main[[df]], sheet = sheet, col.names = TRUE, row.names = FALSE)
}
 

Это исправило заголовки так, как я хотел, данные бесполезны:

Хороший заголовок, но плохой формат данных!

Испытание 3

В качестве последнего средства я попытался просто добавить один прямой фрейм данных в книгу, и это привело к экспорту хороших заголовков с плохими данными, так что, возможно, мое использование списков не является проблемой (?):

 wb = createWorkbook()
sheet = createSheet(wb, "df_Main")
addDataFrame(df_Main, sheet = sheet, col.names = TRUE, row.names = FALSE)

 

Просто добавьте простой фрейм данных-но все равно неправильно!

То, что я ищу

Основываясь на пробной версии 3, я не считаю, что проблема в том, что я использую списки (но, может быть?). Прежде всего, я просто хочу знать, что заставляет меня получать неверный вывод, это мой синтаксис или мое использование library(xlsx) просто проблематично (я знаю, что он каким-то образом использует java). Если library(xlsx) проблема заключается в пакете, то каков более надежный способ достижения этих целей?

Ответ №1:

Рассмотрите возможность упаковки с unname

 for (df in names(lst_Main)) {
   sheet = createSheet(wb, df)
   addDataFrame(unname(lst_Main[df]), sheet = sheet, col.names = TRUE, row.names = FALSE)
 }
 

-выход

введите описание изображения здесь


Это также работает с одним файлом, если он завернут в list

 wb = createWorkbook()
sheet = createSheet(wb, "df_Main")
addDataFrame(list(df_Main), sheet = sheet, col.names = TRUE, row.names = FALSE)
 

-выход

введите описание изображения здесь


Основная причина , по которой отдельные данные/несколько наборов данных OP не работают, заключается в том, что они не data.frame работают, но tibble . Подумайте о том, чтобы изменить его на data.frame , и он будет работать

 df_Main <- as.data.frame(df_Main)
wb = createWorkbook()
sheet = createSheet(wb, "df_Main")
addDataFrame(df_Main, sheet = sheet, col.names = TRUE, row.names = FALSE)
 

-выход

введите описание изображения здесь


В рамках отрицательной проверки tibble выполните повторное преобразование и повторите это снова

 df_Main <- as_tibble(df_Main)
wb = createWorkbook()
sheet = createSheet(wb, "df_Main")
addDataFrame(df_Main, sheet = sheet, col.names = TRUE, row.names = FALSE)
 

-выход
введите описание изображения здесь


Сама функция говорит addDataFrame , и ожидаемый ввод » x » ?addDataFrame в соответствии с

x — данные.кадр.

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

1. Просто заверните его в list(df_Main) , и он должен работать

2. Это очень полезно-это отвечает на случаи, которые я привел в своей статье. Однако мне просто кажется странным, что я должен заключать фрейм данных в список, когда я использую addDataFrame(x) , в котором используется data.frame x . Я склонен просто дать день или два, чтобы посмотреть, появится ли лучший ответ, прежде чем я приму этот, но я очень благодарен за это. Спасибо.

3. Нет. Это оно. Я новичок в R, и я читал, что есть разница между data.frame и tibble (хотя они близки и часто одинаковы, но не всегда), и, похоже, это все. Я работал исключительно с Тибблсом, и это первый раз, когда это имело значение в том, что я делаю. Спасибо за подробное объяснение. Я чувствую, что теперь это полностью объясняет мои проблемы.

4. @wackojacko1997 Я также был озадачен поведением, пока не попробовал пример в документации. Я не проверял ваш тип данных раньше, и тогда это было очевидно. вы также можете использовать пакет writexl или openxlsx в качестве этих ha