使用 XLSX 和 addDataFrame() 获取正确的 header 名称

Use of XLSX and addDataFrame() to get proper header names

导出到 Excel 的数据帧列表前面有 DF 名称

我正在按城市拆分数据框,并将生成的 数据框列表 导出到它们自己的 Excel sheet,但是 header 每个数据帧的不希望出现 Atlanta.typeAtlanta.kpi 而不是 typekpi。我想了解为什么会发生这种情况以及如何解决它以满足我的需要。我想要的输出应该是这样的(但它不是):

详细示例

设置

这是一个类似于现实生活中的基本数据框,我将按位置将其拆分成一个列表:

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  

现在将其拆分为一系列数据帧,每个数据帧一个 sheet 我将创建:

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  

$`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.typeAtlanta.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

我想也许是因为我没有 double-bracket 列表,所以我尝试了:

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

这以我想要的方式修复了 headers,数据没有用:

试炼 3

作为最后的手段,我尝试只向工作簿添加一个直接的数据框,结果导出了好的 headers 和坏数据,所以也许我对列表的使用不是问题 (?):

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

我在找什么

根据试验 3,我认为我对列表的使用不是问题所在(但也许吧?)。首先,我只想知道是什么导致我得到错误的输出,是我的语法还是我对 library(xlsx) 的使用有问题(我知道它以某种方式使用 java)。如果 library(xlsx) 包有问题,那么实现这些目的更可靠的方法是什么?

考虑用 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/multiple 数据集不起作用的主要原因是它们不是 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 并且根据 ?addDataFrame 的预期输入 'x' 是

x - a data.frame.