我正在嘗試使用多個 y 變數和單個 x 變數創建一個具有多個交叉表的檔案。每個 y 變數都應該有一個單獨的表。我可以對 Markdown 中的每個單獨的交叉表執行此操作,并使用 kableextra 包生成 html 表。但是,我有幾個變數,用一個回圈來做到這一點會更容易。在Stata中,我會這樣:
foreach i of varlist var1 var2 var3 {
tab tab `i' year, row
}
我在 Stata 中遇到的問題是它沒有在選項卡中應用頻率權重。R 確實在交叉表(descr 包)中應用頻率權重,并生成行和列百分比。
這是一個示例資料框:
structure(list(survey_yr = c(2019, 2020, 2019, 2020, 2019, 2020,
2019, 2020, 2019, 2020, 2019, 2020, 2020, 2019, 2019, 2020, 2019,
2020, 2019, 2020), Main_Data = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1), Survey_Month = c(6, 6, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 9, 9, 9, 9, 9, 9, 9), Quarter = c(1,
1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2), Q1A_3L = c(3,
1, 3, 3, 3, 1, 3, 3, 3, 3, 1, 2, 3, 3, 3, 3, 3, 1, 3, 2), Q1B_3L = c(3,
1, 3, 3, 3, 1, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 2, 3, 2), Q1C_3L = c(3,
1, 3, 3, 3, 1, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 2, 3, 2), Q1D_3L = c(3,
2, 3, 3, 3, 1, 3, 3, 3, 2, 1, 3, 3, 3, 3, 3, 3, 1, 3, 2), Q1E_3L = c(3,
2, 3, 3, 3, 1, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 2), Q1F_3L = c(3,
3, 3, 3, 3, 1, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 2), Q1G_3L = c(3,
3, 3, 3, 3, 1, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 2, 3, 2), Q1H_3L = c(3,
2, 3, 3, 3, 1, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 2, 3, 2), Q1I_3L = c(3,
3, 3, 3, 3, 1, 3, 3, 3, 2, 1, 2, 3, 3, 3, 3, 3, 1, 3, 2), Q1J_3L = c(3,
3, 3, 3, 3, 1, 3, 3, 3, 2, 1, 3, 3, 3, 3, 3, 3, 1, 3, 2), Q1K_3L = c(3,
3, 3, 3, 3, 1, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 2, 3, 2), Q1L_3L = c(3,
3, 3, 3, 3, 1, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 1, 3, 2), Q1M_3L = c(3,
2, 3, 3, 3, 1, 3, 3, 3, 3, 1, 3, 3, 3, 3, 1, 3, 2, 3, 2), Q1N_3L = c(3,
2, 3, 3, 3, 1, 3, 3, 3, 2, 1, 3, 3, 3, 3, 1, 3, 3, 3, 2), Q1O_3L = c(3,
2, 3, 3, 3, 1, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 1, 3, 2), Q1P_3L = c(3,
2, 3, 3, 3, 1, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 1, 3, 2), Q1Q_3L = c(3,
1, 3, 3, 3, 1, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 2, 3, 2), Q2_3L = c(3,
2, 3, 3, 3, 1, 3, 3, 3, 3, 1, 1, 3, 3, 3, 3, 3, 1, 3, 2), weight = c(0.680000007152557,
0.680000007152557, 0.823000013828278, 0.823000013828278, 0.823000013828278,
0.823000013828278, 0.823000013828278, 0.823000013828278, 0.823000013828278,
0.823000013828278, 1.27100002765656, 0.823000013828278, 0.823000013828278,
0.823000013828278, 0.823000013828278, 0.823000013828278, 0.823000013828278,
1.57599997520447, 0.823000013828278, 0.823000013828278)), row.names = c(4L,
5L, 6L, 7L, 9L, 10L, 11L, 14L, 15L, 16L, 17L, 18L, 19L, 20L,
23L, 26L, 27L, 28L, 31L, 33L), class = "data.frame")
我一直用于單個交叉表的代碼,它生成了一個非常好的表格:
ct2=crosstab(dat$Q2_3L,dat$survey_yr, weight = dat$weight,
total.c = T, plot = F)
ct2_tab<- descr:::CreateNewTab(ct2)
class(ct2_tab)
kable(ct2_tab) %>%
kable_classic(full_width = F, html_font = "Cambria")
我想找出一種方法來撰寫一個回圈,在多列上執行此操作。這很接近,但我想要特定的列,而不是資料框中的所有列。其次,它將實際列名重命名為“col”,而我需要保留原始列名。最后,我不知道如何將其匯出為 html、docx、excel 或任何型別的檔案。
for (col in df) {
ct_=crosstab(col, dat1$survey_yr,
weight = dat1$weight, format = "SPSS", prop.c = T, plot = F)
print(ct_)
提前致謝。
uj5u.com熱心網友回復:
我想你可以用
library(descr)
for (col in names(df)[5:22]) {
ct_ <- crosstab(df[[col]],
df[["survey_yr"]],
weight = df[["weight"]],
format = "SAS",
prop.c = TRUE,
plot = FALSE)
ct_[["RowData"]] <- col
ct_[["ColData"]] <- "survey_yr"
print(ct_)
}
將names(df)[5:22]在列迭代喜歡“Q1H_3”。這將回傳類似
Cell Contents
|-------------------------|
| N |
| N / Col Total |
|-------------------------|
===============================
survey_yr
Q1Q_3L 2019 2020 Total
-------------------------------
1 1 2 3
0.125 0.222
-------------------------------
2 0 2 2
0.000 0.222
-------------------------------
3 7 5 12
0.875 0.556
-------------------------------
Total 8 9 17
0.471 0.529
===============================
Cell Contents
|-------------------------|
| N |
| N / Col Total |
|-------------------------|
==============================
survey_yr
Q2_3L 2019 2020 Total
------------------------------
1 1 3 4
0.125 0.333
------------------------------
2 0 2 2
0.000 0.222
------------------------------
3 7 4 11
0.875 0.444
------------------------------
Total 8 9 17
0.471 0.529
==============================
列印到txt
您可以使用以下命令將此輸出保存到檔案(例如 .txt 檔案)sink():
for (col in names(df)[5:22]) {
sink(file = paste0(col, ".txt"))
ct_ <- crosstab(df[[col]],
df[["survey_yr"]],
weight = df[["weight"]],
format = "SAS",
prop.c = TRUE,
plot = FALSE)
ct_[["RowData"]] <- col
ct_[["ColData"]] <- "survey_yr"
print(ct_)
sink()
}
這會在您當前的作業目錄中創建多個檔案,例如 Q1A_3L.txt 和 Q1B_3L.txt。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/324527.html
