如何在R语言中从交叉表或n维数组的维度名组中抽样行列名对?
基于交叉表维度名组的抽样实现(Base R)
步骤1:构造示例交叉表
先还原你提供的交叉表数据:
# 创建带维度名的交叉表矩阵 crosstab <- matrix( data = c(10, 15, 20, 25), nrow = 2, dimnames = list( c("吸烟", "非吸烟"), c("男性", "女性") ) )
步骤2:生成维度名组合向量
不需要嵌套循环,用Base R的interaction()函数可以一行生成所有维度名的笛卡尔积组合,且顺序和矩阵按列展开的c(crosstab)完全匹配:
# 生成"吸烟 男性"格式的维度名组合向量 grouped_dimnames <- as.character(interaction(dimnames(crosstab), sep = " "))
执行后grouped_dimnames的结果为:["吸烟 男性", "非吸烟 男性", "吸烟 女性", "非吸烟 女性"],正好对应概率向量c(crosstab)的顺序。
如果你更习惯用expand.grid()+apply()的组合,也可以这么写:
# 另一种实现方式:生成所有维度组合后拼接字符串 grouped_dimnames <- apply(expand.grid(dimnames(crosstab)), 1, function(x) paste(x[1], x[2], sep = " "))
步骤3:执行抽样
直接将生成的向量和概率传入sample()即可:
# 按指定概率抽取1个结果 sample_result <- sample(x = grouped_dimnames, size = 1, prob = c(crosstab))
概率匹配验证
抽样概率完全符合需求:
- "吸烟 男性":
10/70 - "非吸烟 男性":
15/70 - "吸烟 女性":
20/70 - "非吸烟 女性":
25/70
内容的提问来源于stack exchange,提问作者Aku-Ville Lehtimäki
相关产品推荐
相关产品推荐

