我試圖弄清楚是否有一種方法可以使用 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)
(請原諒我有點笨拙的創作,這些天我不經常處理亂數。)
所以我想要做的是創建單獨的表格,顯示 X 縣內所有城鎮的年度預算。我已經能夠通過為每個縣創建新資料集,然后根據新的資料集。當您只查看 5 個縣時,這很好,但是如果是 50 個縣,那就有點麻煩了。
我覺得應該有一些方法可以使用 for 回圈來做到這一點。我的直覺是這樣做,但是當我編譯時,PDF 上沒有列印任何內容。
library(gt)
for (i in 1:5) {
data[data$County == i, ] %>%
gt() %>%
tab_header(
title = "Annual Budget by County",
)
}
如果我選擇一個縣并在沒有回圈的情況下嘗試相同的事情,我沒有問題。
data[data$County == 1, ] %>%
gt() %>%
tab_header(
title = "Annual Budget for County 1",
)
如果我不能讓它發揮作用,這不是世界末日,但我希望有人比我更精明!
謝謝 :)
uj5u.com熱心網友回復:
編輯:由于您似乎還想在 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),
)
})
然后,您可以將 gt 表串列包裝在htmltools包中的 tagList 中,以在 Rmarkdown 檔案中呈現它們中的每一個:
tagList(gt_list)
如果您絕對需要編織到 pdf,請嘗試使用 kables 而不是 gt,替換map為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')
})
```
最后,如果您只是想將每個 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"))
})
uj5u.com熱心網友回復:
只是在for回圈中,結果不是根據 OP 的代碼存盤的。我們可以創建一個 NULLlist為length5 并list根據回圈的序列使用輸出更新
lst1 <- vector('list', 5)
for (i in 1:5) {
lst1[[i]] <- data[data$County == i, ] %>%
gt() %>%
tab_header(
title = "Annual Budget by County",
)
}
如果我們想創建多個物件,可以使用assign但不推薦,即最好將它保存在一個list
或者另一種選擇是split通過“縣”并回圈lapply轉換為gt
lst1 <- lapply(split(data, data$County), function(x)
gt(x) %>%
tab_header(
title = "Annual Budget by County",
) )
uj5u.com熱心網友回復:
經過一番挖掘,我找到了兩個非常有用的鏈接,它們通過在回圈中創建的 gt 表解決了我的 Knit to PDF 問題。YMMV:
- 使用as_latex()
- 修改你的 Rmarkdown yaml
因此,您的整個 Rmarkdown 檔案可能如下所示:
---
title: "gt package pdf output"
output:
pdf_document: default
header-includes:
- \usepackage{caption} # Insert the package used by gt
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
```
```{r, include=FALSE}
library(tidyverse)
library(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)
counties <- data$County %>%
unique() %>%
sort()
```
```{r, results="asis"}
walk(.x = counties, .f = function(x) {
data %>%
filter(County == x) %>%
gt() %>%
tab_header(
title = paste("Annual Budget for County", x),
) %>%
as_latex() %>%
as.character() %>%
cat()
})
```
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/313524.html
下一篇:在結構中使用通用陣列
