如何优化重复生成并合并tabyl对象的R代码?
嘿,我看了你这段生成频率百分比表格的R代码,确实重复的部分有点多,咱们可以把它优化得更高效、更易维护,下面是具体的优化方案:
优化后的R代码方案
首先,我们把重复的过滤、统计逻辑改成批量处理的方式,不用逐个写相同的代码块,后续要新增或修改州的时候也会更方便:
library(tidyverse) library(janitor) library(kableExtra) # 定义需要单独统计的州列表,后续改这个就行 target_states <- c("NSW", "QLD", "VIC", "WA") # 先处理All组的统计表格,给列名加前缀避免合并冲突 all_table <- data2 %>% tabyl(`Q1 - Position`, show_na = FALSE) %>% adorn_pct_formatting() %>% rename_with(~ paste0("All_", .x), -`Q1 - Position`) # 用map批量生成每个州的统计表格,同样给列名加州前缀 state_tables <- map(target_states, function(current_state) { data2 %>% filter(State == current_state) %>% tabyl(`Q1 - Position`, show_na = FALSE) %>% adorn_pct_formatting() %>% rename_with(~ paste0(current_state, "_", .x), -`Q1 - Position`) }) # 合并所有表格:先把All组和州表格列表合并,再依次merge tab.Q1 <- reduce(c(list(all_table), state_tables), ~ merge(.x, .y, all = TRUE, by = "Q1 - Position")) # 最后格式化输出,先把第一列重命名得更简洁 tab.Q1 %>% rename(Position = `Q1 - Position`) %>% kable(digits = 2, col.names = c("Position", col.au)) %>% kable_styling(bootstrap_options = c("striped", "hover"))
优化点说明:
- 消除重复代码:用
purrr::map批量处理所有目标州,不用重复写filter+tabyl的逻辑,代码更简洁 - 避免列名冲突:给All组和各个州的统计列(频率、百分比)加上前缀,合并表格时不会出现列名重复的问题
- 可扩展性拉满:以后要加其他州,只需要在
target_states里加州名就行,不用改后面的处理代码 - 逻辑更清晰:把生成单表、批量生成、合并、输出拆成不同步骤,可读性更高,也方便调试
另外提一句,因为All组的范围远大于这四个州,所以单独处理All组再合并的方式是最准确的,比用group_by加总计的方式更稳妥,不会出现统计范围错误的问题。
内容的提问来源于stack exchange,提问作者Lyndon Walker
相关产品推荐
相关产品推荐

