我们可以在subsetting 之后的table 输出上使用proportions 来删除NA (complete.cases) 和selecting 列
数据来自forcats 包。所以,加载包并获取数据
library(forcats)
data(gss_cat)
如上所述使用table/proportions
by_age2_base <- proportions(table(subset(gss_cat, complete.cases(age),
select = c(age, marital))), 1)
-输出
head(by_age2_base, 3)
marital
age No answer Never married Separated Divorced Widowed Married
18 0.000000000 0.978021978 0.000000000 0.000000000 0.000000000 0.021978022
19 0.000000000 0.939759036 0.000000000 0.012048193 0.004016064 0.044176707
20 0.000000000 0.904382470 0.003984064 0.007968127 0.000000000 0.083665339
-与 OP 的输出比较
head(by_age2, 3)
# A tibble: 3 x 4
# Groups: age [2]
age marital n prop
<int> <fct> <int> <dbl>
1 18 Never married 89 0.978
2 18 Married 2 0.0220
3 19 Never married 234 0.940
如果我们需要“长”格式的输出,请将table 转换为data.frame 和as.data.frame
by_age2_base_long <- subset(as.data.frame(by_age2_base), Freq > 0)
或者另一个选项是aggregate/ave(使用R 4.1.0)
subset(gss_cat, complete.cases(age), select = c(age, marital)) |>
{\(dat) aggregate(cbind(n = age) ~ age + marital,
data = dat, FUN = length)}() |>
transform(prop = ave(n, age, FUN = \(x) x/sum(x)))