使用For循环创建多个表

Abi*_* C. 5 for-loop r gt

我试图弄清楚是否有一种方法可以使用 for 循环一次性创建多个表,所有表都使用相同的数据集 - 我将在一秒钟内澄清这一点。我正在使用 R Markdown,因为我最终需要将其编译为 PDF(如果这有什么区别的话)。

因此,我正在使用一个数据库,并尝试根据其中一个变量的值将其分成多个表(使用 gt)。假设我的数据集是关于城镇的年度预算。

data <- data.frame(x=1, y=1:15, z=16:30)
colnames(data) <- c("County", "Town", "Budget")
sample.space <- c(1:5)
number.samples <- 15
data$County <- sample(sample.space, number.samples, replace = TRUE)
sample.space2 <- c(2500:5000)
data$Budget <- sample(sample.space2, number.samples, replace = FALSE)
Run Code Online (Sandbox Code Playgroud)

(请原谅我的创作有些笨拙,我现在不经常处理随机数。)

因此,我想做的是创建单独的表格,显示 X 县内所有城镇的年度预算。通过为每个县创建新的数据集,然后根据新的数据集制作一个表格,我已经能够很好地做到这一点。数据集。当您只查看 5 个县时,这没问题,但如果是 50 个县,那就有点麻烦了。

我觉得应该有某种方法可以使用 for 循环来做到这一点。我的直觉是这样做,但是当我编译时,PDF 上没有打印任何内容。

library(gt)

for (i in 1:5) {
  data[data$County == i, ] %>%
    gt() %>%
    tab_header(
      title = "Annual Budget by County",
    ) 
}
Run Code Online (Sandbox Code Playgroud)

如果我选择一个县并在没有循环的情况下尝试同样的事情,我没有问题。

data[data$County == 1, ] %>%
    gt() %>%
    tab_header(
      title = "Annual Budget for County 1",
    ) 
Run Code Online (Sandbox Code Playgroud)

如果我不能让它发挥作用,这并不是世界末日,但我希望比我更精明的人能够解决它!

谢谢 :)

dan*_*anh 6

编辑:由于您似乎还想在 Rmarkdown 文档中输出其中每一个,因此我添加了有关如何执行此操作的说明。然而,该解决方案可能仅适用于使用 gt 包编织 html 文档。针织到 pdf 引发了本问题范围之外的许多其他问题,但总的来说,使用kables而不是 gt 针织到 pdf 可能会有更好的体验。

使用for 迭代purrr中的包tidyverse

library(gt)
library(htmltools)
library(tidyverse)

counties <- data$County %>% 
  unique() %>%
  sort()

gt_list <- map(.x = counties,  .f = function(x) {
  data %>%
    filter(County == x) %>%
    gt() %>%
    tab_header(
      title = paste("Annual Budget for County", x),
    ) 
})
Run Code Online (Sandbox Code Playgroud)

然后,您可以将 gt 表列表包装在htmltools包中的 tagList 中,以在 Rmarkdown 文档中呈现每个表:

tagList(gt_list)
Run Code Online (Sandbox Code Playgroud)

如果您绝对需要编织为 pdf,请尝试使用 kables 而不是 gt,用mapwith代替walk(因为您现在只是迭代打印 kable 的副作用)。另外,请确保设置块选项results = "asis"

```{r, results = "asis"}
walk(.x = counties,  .f = function(x) {
  df <- data %>%
    filter(County == x) 
    
  print(knitr::kable(df, caption = paste("Annual Budget for County", x)))
  cat('\n\n\n\n')
})
```
Run Code Online (Sandbox Code Playgroud)

最后,如果您只是想将每个 gt 输出到其自己的 pdf 文件(或类似文件),您可以执行以下操作:

walk(.x = counties,  .f = function(x) {
  data %>%
    filter(County == x) %>%
    gt() %>%
    tab_header(
      title = paste("Annual Budget for County", x),
    ) %>%
    gtsave(paste0("County_", x, ".pdf"))
})
Run Code Online (Sandbox Code Playgroud)


akr*_*run 0

只是在for循环中结果不是根据OP的代码存储的。list我们可以创建 5的NULLlengthlist根据循环序列更新输出

lst1 <- vector('list', 5)
for (i in 1:5) {
 lst1[[i]] <- data[data$County == i, ] %>%
    gt() %>%
    tab_header(
      title = "Annual Budget by County",
    ) 
}
Run Code Online (Sandbox Code Playgroud)

如果我们想创建多个对象,可以使用assign但不推荐,即最好将其保存在一个list


或者另一种选择是split按“县”并循环lapply转换为gt

lst1 <- lapply(split(data, data$County), function(x) 
              gt(x) %>%
      tab_header(
      title = "Annual Budget by County",
    ) )
Run Code Online (Sandbox Code Playgroud)