给定此数据帧:

library(tidyverse)
library(openxlsx)

df.1 <- tribble(
  ~customer  ,~period, ~cost1, ~cost2 , ~prod,
  'cust1',  '202201', 5, 10, 'online',
  'cust1',  '202202', 5, 10, 'online',
  'cust1',  '202203', 5, 10, 'in-person',
  'cust1',  '202204', 5, 10, 'in-person',
  'cust2',  '202203', 5, 10,'online',
  'cust2',  '202204', 5, 10, 'in-person',
  'cust2',  '202202', 5, 10,'online',
  'cust3',  '202204', 5, 10,'online'
 'cust4',  '202101', NA, NA, 'online',
  'cust4',  '202102', NA,10, 'online'
  
)

我正在try for each 客户创建一个Excel文件,并基于变量prod动态添加选项卡,其中一些文件可能有一个选项卡,而另一些文件可能有多个选项卡,这取决于他们有多少产品.

我还想删除所有值都是NA的任何列,因此在这个简单的示例中,cust4的文件不会有列cost1.

以下是我try 过的方法.它似乎按客户和产品拆分文件,但它没有- for each 客户创建一个文件,并且它不会删除所有值为NA的列

list(tab1 = df.1) %>%
  map(\(df) split(df, list(df.1$customer, df.1$prod), drop =T)) %>%
  janitor::remove_empty(., which = 'cols') %>% 
  iwalk(\(df, nm) write.xlsx(df, paste0(nm, ".xlsx"), startRow = 6))

我怎样才能做到这一点呢?我希望有4个文件,每个产品都有一个标签,在客户4‘S的情况下只有4列,而不是5列

推荐答案

这里有一种方法可以实现您想要的结果,即

  1. 将数据集拆分为customer
  2. 使用iwalk循环访问客户数据帧列表
  3. 删除空列
  4. 将客户DF除以prod
  5. 导出产品数据帧的结果列表
library(tidyverse)
library(openxlsx)

df.1 %>% 
  split(.$customer) %>%
  iwalk(\(df, nm) {
    df %>%
      janitor::remove_empty(which = 'cols') %>% 
      split(.$prod) |> 
      write.xlsx(paste0(nm, ".xlsx"), startRow = 6)
  })

read.xlsx("cust4.xlsx", "online")
#>   customer period cost2   prod
#> 1    cust4 202101    NA online
#> 2    cust4 202102    10 online

多亏了@Mr Flick的 comments ,我们可以像这样使用基础管道|>达到同样的结果:

df.1 |>  
  split(~customer) %>%
  iwalk(\(df, nm) {
    df |> 
      janitor::remove_empty(which = 'cols') |> 
      split(~prod) |> 
      write.xlsx(paste0(nm, ".xlsx"), startRow = 6)
  })

EDIT您可以通过首先拆分prod并使用map来删除每个产品的空COLS,如下所示:

df.1 |>  
  split(~customer) %>%
  iwalk(\(df, nm) {
    df |> 
      split(~prod) |> 
      map(~janitor::remove_empty(.x, which = 'cols')) |>
      write.xlsx(paste0(nm, ".xlsx"), startRow = 6)
  })

R相关问答推荐

基于R中的GPS点用方向箭头替换点

从R中的另一个包扩展S3类的正确方法是什么

编辑文件后编辑RhandsonTable

将嵌套列表子集化为嵌套列表

如何在一次运行中使用count进行多列计数

使用整齐的计算(curl -curl )和杂音

传递ggplot2的变量作为函数参数—没有映射级别以正确填充美学

有没有办法使用ggText,<;Sub>;&;<;sup>;将上标和下标添加到同一元素?

在另一个包中设置断点&S R函数

我们如何在R中透视数据并在之后添加计算

如何使用前缀作为匹配来连接数据帧?

如何将这个小列表转换为数据帧?

我如何使用循环来编写冗余的Rmarkdown脚本?

在ggplot2上从多个数据框创建复杂的自定义图形

多元正态分布的计算

按两个因素将观测值分组后计算单独的百分比

如何判断代码是否在R Markdown(RMD)上下文中交互运行?

在ggploy中创建GeV分布时出错

删除r中每个因素级别的最后2行

如何从矩阵绘制环弦图