使用 XLSX 和 addDataFrame() 获取正确的 header 名称
Use of XLSX and addDataFrame() to get proper header names
导出到 Excel 的数据帧列表前面有 DF 名称
我正在按城市拆分数据框,并将生成的 数据框列表 导出到它们自己的 Excel sheet,但是 header 每个数据帧的不希望出现 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
现在将其拆分为一系列数据帧,每个数据帧一个 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.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
我想也许是因为我没有 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.
导出到 Excel 的数据帧列表前面有 DF 名称
我正在按城市拆分数据框,并将生成的 数据框列表 导出到它们自己的 Excel sheet,但是 header 每个数据帧的不希望出现 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
现在将其拆分为一系列数据帧,每个数据帧一个 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.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
我想也许是因为我没有 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.