expss 表中的加权累积百分比 (ascending/descending)
Weighted cumulative percents (ascending/descending) in expss tables
我想使用 expss 包构建 tables 的累积百分比,包括升序 (0% -> 100%) 和降序 (100% -> 0%)。已经有一个用于升序的现有函数(即 fre()
),尽管生成的 table 可定制性不高。
我想将这些计算包含在 tab_stat_fun
指令中,并设法获得未加权数据集的所需输出。考虑以下示例(infert
数据集):
infert %>%
tab_cells(age) %>%
tab_cols(total()) %>%
tab_stat_cases(label="N", total_row_position="above", total_statistic="u_cases", total_label="TOTAL") %>%
tab_stat_cpct(label="%Col.", total_row_position="above", total_statistic="u_cpct", total_label="TOTAL") %>%
tab_stat_fun(label="% Asc.", function(x){100*cumsum(table(sort(x)))/sum(table(sort(x)))}) %>%
tab_stat_fun(label="% Desc.", function(x){100-(100*cumsum(table(sort(x)))/sum(table(sort(x))))}) %>%
tab_pivot(stat_position="inside_columns")
效果很好,但如果我想用数字向量对这些结果进行权衡(为了演示:infert$w <- as.vector(x=rep(2, times=nrow(infert)), mode='numeric')
),这将不可避免地导致错误,因为 sum 和 cumsum 都不接受权重参数(据我所知)
是否有一个特殊的内置函数可以解决这个问题?或者可能意味着将年龄向量乘以权重向量的函数组合?
没有现成的功能。然而,我们可以利用您的方法,只需将 base::table
替换为 base::xtabs
。后者可以计算加权频率:
library(expss)
data(infert)
infert$w <- as.vector(x=rep(2, times=nrow(infert)), mode='numeric')
cumpercent = function(x, weight = NULL){
if(is.null(weight)) weight = rep(1, length(x))
counts = xtabs(weight ~ x)
100*cumsum(counts)/sum(counts)
}
infert %>%
tab_cells(age) %>%
tab_cols(total()) %>%
tab_weight(w) %>%
tab_stat_cases(label="N", total_row_position="above", total_statistic="u_cases", total_label="TOTAL") %>%
tab_stat_cpct(label="%Col.", total_row_position="above", total_statistic="u_cpct", total_label="TOTAL") %>%
tab_stat_fun(label="% Asc.", cumpercent) %>%
tab_stat_fun(label="% Desc.", function(x, weight = NULL){100-cumpercent(x, weight)}) %>%
tab_pivot(stat_position="inside_columns")
我想使用 expss 包构建 tables 的累积百分比,包括升序 (0% -> 100%) 和降序 (100% -> 0%)。已经有一个用于升序的现有函数(即 fre()
),尽管生成的 table 可定制性不高。
我想将这些计算包含在 tab_stat_fun
指令中,并设法获得未加权数据集的所需输出。考虑以下示例(infert
数据集):
infert %>%
tab_cells(age) %>%
tab_cols(total()) %>%
tab_stat_cases(label="N", total_row_position="above", total_statistic="u_cases", total_label="TOTAL") %>%
tab_stat_cpct(label="%Col.", total_row_position="above", total_statistic="u_cpct", total_label="TOTAL") %>%
tab_stat_fun(label="% Asc.", function(x){100*cumsum(table(sort(x)))/sum(table(sort(x)))}) %>%
tab_stat_fun(label="% Desc.", function(x){100-(100*cumsum(table(sort(x)))/sum(table(sort(x))))}) %>%
tab_pivot(stat_position="inside_columns")
效果很好,但如果我想用数字向量对这些结果进行权衡(为了演示:infert$w <- as.vector(x=rep(2, times=nrow(infert)), mode='numeric')
),这将不可避免地导致错误,因为 sum 和 cumsum 都不接受权重参数(据我所知)
是否有一个特殊的内置函数可以解决这个问题?或者可能意味着将年龄向量乘以权重向量的函数组合?
没有现成的功能。然而,我们可以利用您的方法,只需将 base::table
替换为 base::xtabs
。后者可以计算加权频率:
library(expss)
data(infert)
infert$w <- as.vector(x=rep(2, times=nrow(infert)), mode='numeric')
cumpercent = function(x, weight = NULL){
if(is.null(weight)) weight = rep(1, length(x))
counts = xtabs(weight ~ x)
100*cumsum(counts)/sum(counts)
}
infert %>%
tab_cells(age) %>%
tab_cols(total()) %>%
tab_weight(w) %>%
tab_stat_cases(label="N", total_row_position="above", total_statistic="u_cases", total_label="TOTAL") %>%
tab_stat_cpct(label="%Col.", total_row_position="above", total_statistic="u_cpct", total_label="TOTAL") %>%
tab_stat_fun(label="% Asc.", cumpercent) %>%
tab_stat_fun(label="% Desc.", function(x, weight = NULL){100-cumpercent(x, weight)}) %>%
tab_pivot(stat_position="inside_columns")