1

我的问题可以考虑扩展以下讨论:R expss package: format numbers by statistic / apply different format to alternate rows

我想了解条件的语法以便能够编写自己的自定义格式。考虑数据集中的“插入”数据框。然后我们通过 expss 创建下表:

infert %>%
  tab_cells(parity) %>%
  ### TOTAL
  tab_cols(total()) %>%
  tab_stat_cases(label="N", total_row_position="none") %>%
  ### OTHER VARIABLES
  tab_cols(education) %>%
  tab_stat_cases(label="N", total_row_position="none") %>% 
  tab_stat_cpct(label="%Col.", total_row_position="none") %>%
  tab_pivot(stat_position="inside_columns") %>%
  format_vert()

最后一行操作基本格式,如上面的 URL 中所述。详细说明:

format_vert = function(tbl, pct_digits=2, n_digits=0){
  #Finding columns to format
  pct_cols = grepl("\\|%Col.$", names(tbl), perl = TRUE)
  n_cols = grepl("\\|N$", names(tbl), perl = TRUE)
  #Format
  recode(tbl[,-1]) = other ~ function(x) ifelse(is.numeric(x) & is.na(x), 0, x)
  tbl[,pct_cols] = format(tbl[,pct_cols], digits=pct_digits, nsmall=pct_digits) 
  tbl[,n_cols] = format(tbl[,n_cols], digits=n_digits, nsmall=n_digits)
  recode(tbl[,pct_cols]) = other ~ function(x) paste0(x, "%")
  tbl
}

我了解如何格式化整个表格或列(专家会注意到与 URL 中示例的差异),但如果我只想格式化特定单元格怎么办?例如,digits=0当 value = 100,00%(只显示 100%)时如何设置?我不知道我是否应该去,,,recode何时format何地参考tbl[,pct_cols]......

谢谢!

4

1 回答 1

1

recode最简单的方法是在函数中插入额外的重新编码format_vert。我们不能以 '100.00' ~ '100' 的形式使用重新编码,因为列已经与空格对齐。所以我们使用正则表达式。perl表示 perl 风格的正则表达式比较,\\b表示单词边界。与该表达式匹配的所有值都将被重新编码。

data(infert)
format_vert = function(tbl, pct_digits=2, n_digits=0){
    #Finding columns to format
    pct_cols = grepl("\\|%Col.$", names(tbl), perl = TRUE)
    n_cols = grepl("\\|N$", names(tbl), perl = TRUE)
    #Format
    recode(tbl[,-1]) = other ~ function(x) ifelse(is.numeric(x) & is.na(x), 0, x)
    tbl[,pct_cols] = format(tbl[,pct_cols], digits=pct_digits, nsmall=pct_digits) 
    tbl[,n_cols] = format(tbl[,n_cols], digits=n_digits, nsmall=n_digits)
    recode(tbl[,pct_cols]) = c(
        perl("\\b0.00\\b") ~ "0%   ",  # additional recodings
        perl("\\b100.00\\b") ~ "100%   ", # additional recodings
        other ~ function(x) paste0(x, "%")
    )
    tbl
}

infert %>%
    tab_cells(parity) %>%
    ### TOTAL
    tab_cols(total()) %>%
    tab_stat_cases(label="N", total_row_position="none") %>%
    ### OTHER VARIABLES
    tab_cols(education) %>%
    tab_stat_cases(label="N", total_row_position="none") %>% 
    tab_stat_cpct(label="%Col.", total_row_position="none") %>%
    tab_pivot(stat_position="inside_columns") %>%
    format_vert()
于 2020-04-07T21:35:25.303 回答