r-如何将同一数据源中的不同组导出到不同的Excel工作簿

  • 本文关键字:Excel 工作簿 数据源 r loops
  • 更新时间 :
  • 英文 :


我目前在R中有一个tibble,我想将其导出到excel,但我不想将整个tibble导出到一个大型工作簿,而是希望有单独的工作簿,每个工作簿对应于我已经定义的分组变量中的一个不同值。

对于再现性,我将使用iris数据集作为示例。我想要的最终结果是三本独立的工作簿,每种鸢尾、刚毛、云芝和弗吉尼亚,每本都包含萼片的长度和宽度,每个工作簿的文件名与物种名称相对应,即刚毛.csv、云芝.csv和弗吉尼亚.csv。我能想到的唯一方法就是这样一个接一个地做:

iris %>% 
filter(Species == "setosa") %>%
select(Sepal.Length, Sepal.Width) %>%
write_csv(path = "setosa.csv")

因为我的分组变量有50多个可能的值(都是字符串(,所以一次只做一个显然是不现实的。我想我可以用循环来解决这个问题,但我对我的循环写作能力没有信心,甚至在这里尝试。

您可以通过Species将数据帧分离为数据帧列表,然后使用sapply:

library(tidyverse)
df <- iris %>% 
split(f = iris$Species)
sapply(names(df), function(x) write_csv(df[[x]], file = paste0(x, ".csv")))

这应该会返回您想要的结果。

您可以使用purrr执行此操作。首先按组列拆分数据帧,然后写入每个子集。

这里有一个通用函数:


save_groupwise <- function(data, group_col, path = ""){

# Split into subsets
splits <- split(x = data, f = data[[group_col]])

# Save each subset
purrr::map2(
.x = splits,
.y = names(splits),
.f = function(.x, .y){
readr::write_csv(.x, path = paste0(path, .y, ".csv"))
}
)

# Don't return anything
invisible()
}
iris %>% 
save_groupwise("Species")

最新更新