|
1 | | -unweighted_pcts_strata[lvl, s_lvl]) |
2 | | -} |
3 | | -row_data[[s_lvl]] <- val |
4 | | -} |
5 | | -results_list[[length(results_list) + 1]] <- row_data |
6 | | -} |
7 | | -} else if (is.numeric(df[[var]])) { |
8 | | -unweighted_mean_overall <- mean(df[[var]], na.rm = TRUE) |
9 | | -unweighted_sd_overall <- stats::sd(df[[var]], na.rm = TRUE) |
10 | | -unweighted_mean_strata <- tapply(df[[var]], df[[strata_var]], mean, na.rm = TRUE) |
11 | | -unweighted_sd_strata <- tapply(df[[var]], df[[strata_var]], stats::sd, na.rm = TRUE) |
12 | | -if (mode %in% c("weighted", "mixed")) { |
13 | | -weighted_mean_overall <- svymean(var_formula, design, na.rm = TRUE) |
14 | | -weighted_var_overall <- svyvar(var_formula, design, na.rm = TRUE) |
15 | | -weighted_stats_strata <- svyby(var_formula, strata_formula, design, svymean, na.rm = TRUE) |
16 | | -weighted_var_strata <- svyby(var_formula, strata_formula, design, svyvar, na.rm = TRUE) |
17 | | -} |
18 | | -row_data <- data.frame(Variable = "", Level = "Mean (SD)", stringsAsFactors = FALSE) |
19 | | -if (mode %in% c("mixed", "weighted")) { |
20 | | -val <- sprintf("%.2f (%.2f)", weighted_mean_overall, sqrt(weighted_var_overall)) |
21 | | -} else { |
22 | | -val <- sprintf("%.2f (%.2f)", unweighted_mean_overall, unweighted_sd_overall) |
23 | | -} |
24 | | -row_data$Overall <- val |
25 | | -for (i in seq_along(strata_levels)) { |
26 | | -s_lvl <- strata_levels[i] |
27 | | -if (mode %in% c("mixed", "weighted")) { |
28 | | -mean_val <- weighted_stats_strata[i, var] |
29 | | -sd_val <- sqrt(weighted_var_strata[i, var]) |
30 | | -val <- sprintf("%.2f (%.2f)", mean_val, sd_val) |
31 | | -} else { |
32 | | -val <- sprintf("%.2f (%.2f)", unweighted_mean_strata[s_lvl], unweighted_sd_strata[s_lvl]) |
33 | | -} |
34 | | -row_data[[s_lvl]] <- val |
35 | | -} |
36 | | -results_list[[length(results_list) + 1]] <- row_data |
37 | | -} |
38 | | -} |
39 | | -final_table <- do.call(rbind, results_list) |
40 | | -return(final_table) |
41 | | -} |
42 | | -# --- 3. Running Example: Flegal (2016) NHANES Data --- |
43 | | -# --- Data Preparation --- |
44 | | -# Load the dataset from a working URL. |
45 | | -load(url("https://raw.githubusercontent.com/epiverse-trace/datasets/raw/main/RData/Flegal2016.RData")) |
46 | | -load("E:/GitHub/EpiMethods/Data/surveydata/Flegal2016.RData") |
47 | | -# --- 1. Load Required Libraries --- |
48 | | -# This script requires the 'survey' and 'dplyr' packages. |
49 | | -# If you don't have them, run: install.packages(c("survey", "dplyr")) |
50 | | -library(survey) |
51 | | -library(dplyr) |
52 | | -# --- 2. The Final, Self-Contained svytable1 Function --- |
53 | | -# This function is robust and handles survey complexities internally. |
54 | | -svytable1 <- function(design, strata_var, table_vars, |
55 | | -mode = "mixed", commas = TRUE) { |
56 | | -# --- Lonely PSU Handling --- |
57 | | -old_option <- getOption("survey.lonely.psu") |
58 | | -options(survey.lonely.psu = "adjust") |
59 | | -on.exit(options(survey.lonely.psu = old_option)) |
60 | | -# --- Input Validation --- |
61 | | -df <- design$variables |
62 | | -all_vars <- c(strata_var, table_vars) |
63 | | -missing_vars <- all_vars[!all_vars %in% names(df)] |
64 | | -if (length(missing_vars) > 0) { |
65 | | -stop(paste("The following variables were not found in the data:", |
66 | | -paste(missing_vars, collapse = ", "))) |
67 | | -} |
68 | | -# --- Helper function for formatting --- |
69 | 1 | format_num <- function(n, is_weighted) { |
70 | 2 | if (is_weighted) n <- round(n) |
71 | 3 | if (commas) return(format(n, big.mark = ",")) |
@@ -510,3 +442,71 @@ devtools::check() # Full check with vignettes |
510 | 442 | devtools::check() # Full check with vignettes |
511 | 443 | # 8. IF VIGNETTES ARE IMPORTANT: |
512 | 444 | devtools::build_vignettes() |
| 445 | +# 1. SETUP (do this first, once per session) |
| 446 | +library(devtools) |
| 447 | +library(roxygen2) |
| 448 | +# 3. UPDATE DOCUMENTATION |
| 449 | +devtools::document() # This runs roxygen2::roxygenise() |
| 450 | +# 4. REMOVE OLD VERSION (if testing locally) |
| 451 | +remove.packages("svyTable1") |
| 452 | +# 5. TEST YOUR CHANGES |
| 453 | +devtools::test() # Run unit tests |
| 454 | +# 6. INSTALL LOCALLY TO TEST |
| 455 | +devtools::install() # Install and load to test interactively |
| 456 | +# 6. INSTALL LOCALLY TO TEST |
| 457 | +devtools::install() # Install and load to test interactively |
| 458 | +# 7. COMPREHENSIVE PACKAGE CHECK |
| 459 | +devtools::check() # Full check with vignettes |
| 460 | +# 1. SETUP (do this first, once per session) |
| 461 | +library(devtools) |
| 462 | +library(roxygen2) |
| 463 | +# 2. MAKE YOUR CODE CHANGES first (edit R/ files) |
| 464 | +# ... edit your functions, add features, fix bugs ... |
| 465 | +# 3. UPDATE DOCUMENTATION |
| 466 | +devtools::document() # This runs roxygen2::roxygenise() |
| 467 | +# 4. REMOVE OLD VERSION (if testing locally) |
| 468 | +remove.packages("svyTable1") |
| 469 | +# 5. TEST YOUR CHANGES |
| 470 | +devtools::test() # Run unit tests |
| 471 | +# 6. INSTALL LOCALLY TO TEST |
| 472 | +devtools::install() # Install and load to test interactively |
| 473 | +# 7. COMPREHENSIVE PACKAGE CHECK |
| 474 | +devtools::check() # Full check with vignettes |
| 475 | +# 1. SETUP (do this first, once per session) |
| 476 | +library(devtools) |
| 477 | +library(roxygen2) |
| 478 | +# 3. UPDATE DOCUMENTATION |
| 479 | +devtools::document() # This runs roxygen2::roxygenise() |
| 480 | +# 4. REMOVE OLD VERSION (if testing locally) |
| 481 | +remove.packages("svyTable1") |
| 482 | +# 5. TEST YOUR CHANGES |
| 483 | +devtools::test() # Run unit tests |
| 484 | +# 6. INSTALL LOCALLY TO TEST |
| 485 | +devtools::install() # Install and load to test interactively |
| 486 | +devtools::check(build_args = "--no-build-vignettes") |
| 487 | +devtools::document() |
| 488 | +devtools::check(build_args = "--no-build-vignettes") |
| 489 | +devtools::document() |
| 490 | +devtools::check(build_args = "--no-build-vignettes") |
| 491 | +# 1. SETUP (do this first, once per session) |
| 492 | +library(devtools) |
| 493 | +library(roxygen2) |
| 494 | +# 2. MAKE YOUR CODE CHANGES first (edit R/ files) |
| 495 | +# ... edit your functions, add features, fix bugs ... |
| 496 | +# 3. UPDATE DOCUMENTATION |
| 497 | +devtools::document() # This runs roxygen2::roxygenise() |
| 498 | +# 4. REMOVE OLD VERSION (if testing locally) |
| 499 | +remove.packages("svyTable1") |
| 500 | +# 5. TEST YOUR CHANGES |
| 501 | +devtools::test() # Run unit tests |
| 502 | +# 6. INSTALL LOCALLY TO TEST |
| 503 | +devtools::install() |
| 504 | +devtools::check(build_args = "--no-build-vignettes") |
| 505 | +devtools::document() |
| 506 | +devtools::check(build_args = "--no-build-vignettes") |
| 507 | +# 8. IF VIGNETTES ARE IMPORTANT: |
| 508 | +devtools::build_vignettes() |
| 509 | +# 3. UPDATE DOCUMENTATION |
| 510 | +devtools::document() # This runs roxygen2::roxygenise() |
| 511 | +# 8. IF VIGNETTES ARE IMPORTANT: |
| 512 | +devtools::build_vignettes() |
0 commit comments