在R数据框中添加组子标题并保存到Excel

bjp0bcyl  于 2023-03-20  发布在  其他
关注(0)|答案(2)|浏览(122)

我想在一个表中添加子标题。这是我当前 Dataframe 的格式。
| 参数|人数|HC|百分比|集团|
| - ------|- ------|- ------|- ------|- ------|
| A类|三二四|三二四|0%|1个|
| B|一百七十三|小行星12902|百分之一点三|1个|
| C级|六十八|小行星|百分之五点八|第二章|
| D级|三九六|小行星12902|百分之三点一|三个|
| E级|58%|- -|- -|三个|
| D级|-100%|- -|- -|四个|
我正在寻找一个结构如下所示,我将导出到Excel与openxlsx和writeData。
| 参数|人数|HC|百分比|
| - ------|- ------|- ------|- ------|
| 第1组||||
| A类|三二四|三二四|0%|
| B|一百七十三|小行星12902|百分之一点三|
| 第二组||||
| C级|六十八|小行星|百分之五点八|
| 第三组||||
| D级|三九六|小行星12902|百分之三点一|
| E级|58%|- -|- -|
| 第四组||||
| D级|-100%|- -|- -|
这是我一直在做的代码,但是我没有得到我想要的结果。

# Add group subheaders and remove group column
df_subheader <- df%>%
  group_by(Group) %>%
  mutate(subheader = paste("Group:", Group[1])) %>%
  ungroup() %>%
  select(-Group)

# Reorder dataframe by subheader
df_subheader <- df_subheader[order(df_subheader$subheader),]

# Print resulting dataframe
df_subheader  %>% view()

如果我也可以添加一个主题时,保存在Excel将是伟大的。

jum4pzuy

jum4pzuy1#

下面是一个解决方案,使用一个定制函数用openxlsx2编写列表,以演示我将如何处理手头的问题(我将百分比值排列在一列中)。

# example data
dat <- data.frame(
  Parameter = c("A", "B", "C", "D", "E", "D"),
  Number = c(324, 173, 68, 396, NA, NA),
  HC = c(0, 1.3, 5.8, 3.1, 58, 100),
  Group = c(1, 1, 2, 3, 3, 4)
)

# split into list and prepare percentage output
dat$Group <- paste0("Group", dat$Group)
dat$HC <- dat$HC / 100
out <- split(dat[,-4] , f =  dat$Group)
for (i in seq_along(out)) {
  class(out[[i]]$HC) <- c(class(out[[i]]$HC), "percentage")
}

library(openxlsx2)

# custom helper function to write colored lists
wb_add_list <- function(wb, x) {
  wb <- wb$clone()
  row <- 1
  for (i in seq_along(x)) {
    wb$add_data(startRow = row, x = names(x[i]), colNames = FALSE)
    wb$merge_cells(rows = row, cols = 1:3)
    dims <- paste0("A", row)
    wb$add_fill(dims =  dims, color = wb_color("red"))
    wb$add_font(dims =  dims, color = wb_color("white"))
    row <- row + 1L
    wb$add_data(startRow = row, x = x[[i]], colNames = FALSE)
    row <- row + nrow(x[[i]])
  }
  wb
}

wb <- wb_workbook() %>% wb_add_worksheet() %>% wb_add_list(x = out)
# wb %>% wb_save("test.xlsx")
# wb %>% wb_open()
3pmvbmvn

3pmvbmvn2#

在导出为Latex或HTML(如gt)的包中,很容易进行这种类型的上下文透视或行分组,但遗憾的是,它们不能导出为xlsx。
要将其导出到Excel中,我通常会使用此自定义函数:

library(tidyverse)
pseudo_pivot_topleft <- function(df, groupby = "id") {

df_seq <-  rowid_to_column(df, var = "rowid")

df_pivotted <- 
  df %>% select(all_of(groupby)) %>% distinct() %>% add_column(rowid = 0, .before = 1) %>% 
  bind_rows( df_seq  ) %>% 
  arrange(across(all_of(groupby)), rowid) %>% 
  select(-rowid)

df_pivotted
}

pseudo_pivot_topleft(df,groupby = "Group")

pseudo_pivot_topleft(df,groupby = "Group") %>% 
    mutate(Parameter = if_else(is.na(Parameter), as.character(Group), Parameter)) %>% 
    select(-Group)

# A tibble: 10 × 4

   Parameter Number HC    Percentage
   <chr>     <chr>  <chr> <chr>     
 1 1         NA     NA    NA        
 2 A         324    324   0%        
 3 B         173    12902 1.3%      
 4 2         NA     NA    NA        
 5 C         68     1166  5.8%      
 6 3         NA     NA    NA        
 7 D         396    12902 3.1%      
 8 E         58%    -     -         
 9 4         NA     NA    NA        
10 D         -100%  -     -

相关问题