我试图弄清楚是否有一种方法可以使用 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)
如果我不能让它发挥作用,这并不是世界末日,但我希望比我更精明的人能够解决它!
谢谢 :)
编辑:由于您似乎还想在 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)
只是在for循环中结果不是根据OP的代码存储的。list我们可以创建 5的NULLlength并list根据循环序列更新输出
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)