如何基于三变量xtabs在R中计算分组响应百分比?
问题描述
- 语言组:希腊语使用者(N=34)、罗马尼亚语使用者(N=15)、俄语使用者(N=16)
- 句型类型:12种不同的希腊语句型,响应选项为「无体貌」「完成体」「未完成体」
- 实验设计:每位参与者完成至少6个每种句型的示例(每人共完成96个句子)
- 核心需求:计算每个语言组在每种句型下,3种响应选项的占比(按各语言组对应句型的总样本数换算为百分比)
已完成操作
数据经Calc整理为.csv格式后导入R,已生成三维列联表,代码及while句型的原始频率结果如下:
three_way3 <- xtabs(~language + response_aspect + sentence_type, data=teliko_eikones) addmargins(three_way3, 2)
sentence type = while response_aspect Language No Aspect Imperfective Perfective Sum GR 9 397 2 408 RO 9 170 1 180 RU 7 183 2 192
期望输出格式
需将原始频率转换为各语言组对应句型内的百分比,示例格式如下(数值为示意):
response_aspect Language No Aspect Imperfective Perfective Sum GR 2.2 97.3 0.4 100 RO 0.0 100.0 0.0 100 RU 0.0 0.0 100.0 100
解决方案
使用R内置的prop.table()函数,通过指定维度参数实现按「语言组+句型」的组合计算占比,具体代码如下:
代码实现
# 计算各语言组在每个句型下的响应占比,按语言组-句型的总样本数换算为百分比 percent_table <- prop.table(three_way3, margin = c(1, 3)) * 100 # 保留1位小数(可根据需求调整位数) percent_table <- round(percent_table, 1) # 添加合计列,确保每行总和为100(修正四舍五入误差) percent_table_with_sum <- addmargins(percent_table, margin = 2, FUN = function(x) round(sum(x), 0)) # 查看指定句型的结果,例如while percent_table_with_sum[ , , "while"]
代码说明
margin = c(1, 3):指定按第1维度(language)和第3维度(sentence_type)分组,计算每组内response_aspect的占比*100:将比例值转换为百分比格式round():控制小数位数,优化结果可读性addmargins():自动生成合计列,解决四舍五入导致的总和偏差问题
内容的提问来源于stack exchange,提问作者Ana
相关产品推荐
相关产品推荐

