#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.framex
. Я склонен просто дать день или два, чтобы посмотреть, появится ли лучший ответ, прежде чем я приму этот, но я очень благодарен за это. Спасибо.3. Нет. Это оно. Я новичок в R, и я читал, что есть разница между data.frame и tibble (хотя они близки и часто одинаковы, но не всегда), и, похоже, это все. Я работал исключительно с Тибблсом, и это первый раз, когда это имело значение в том, что я делаю. Спасибо за подробное объяснение. Я чувствую, что теперь это полностью объясняет мои проблемы.
4. @wackojacko1997 Я также был озадачен поведением, пока не попробовал пример в документации. Я не проверял ваш тип данных раньше, и тогда это было очевидно. вы также можете использовать пакет writexl или openxlsx в качестве этих ha