如何批量计算R中各政党提及不同移民群体的帖子占比?
高效计算各政党提及不同移民群体的帖子占比
问题背景
我正在使用R开展一项研究,分析某国各政党发布移民相关内容的频率。数据中有一列标记帖子是否提及移民(取值为'Yes'或'No'),若标记为'Yes',则另一列会注明提及的具体移民群体。
已算出各政党发布的移民相关帖子占其所有帖子的百分比,现在希望一次性计算各政党提及'Immigrants'、'Higher-paid workers'、'Migrant workers'、'Domestic workers'这四类移民群体的帖子占比,无需逐个计算。
现有代码:
- 计算各政党移民相关帖子占比:
sg_percent_all <- sg_parties %>% group_by(party_name) %>% summarise(prop = (sum(migration == "Yes")/ n())*100)
- 单个群体占比计算:
sg_parties %>% group_by(party_name) %>% summarise(prop = (sum(migrant_grp == "Immigrants")/ n())*100)
解决方案
方法1:用across一次性生成多列结果
利用dplyr的across函数,批量遍历指定的四类移民群体,一次性计算每个群体的帖子占比,同时可保留总移民相关帖子的占比:
sg_percent_groups <- sg_parties %>% group_by(party_name) %>% summarise( # 总移民相关帖子占比 prop_total_migration = (sum(migration == "Yes") / n()) * 100, # 批量计算四类群体的占比 across( .cols = c("Immigrants", "Higher-paid workers", "Migrant workers", "Domestic workers"), .fns = ~ (sum(migrant_grp == .x, na.rm = TRUE) / n()) * 100, .names = "prop_{.col}" ) )
na.rm = TRUE:处理migration为'No'时migrant_grp可能为空(NA)的情况,避免计算出错。.names = "prop_{.col}":自动生成列名,比如prop_Immigrants、prop_Higher-paid workers。
方法2:整理成长格式(适合可视化/后续分析)
如果需要将结果转换为每行对应一个政党+一个移民群体的长格式,方便后续做分组图表或统计,可以结合pivot_longer:
sg_percent_long <- sg_parties %>% group_by(party_name) %>% summarise( prop_total_migration = (sum(migration == "Yes") / n()) * 100, prop_Immigrants = (sum(migrant_grp == "Immigrants", na.rm = TRUE) / n()) * 100, prop_Higher_paid_workers = (sum(migrant_grp == "Higher-paid workers", na.rm = TRUE) / n()) * 100, prop_Migrant_workers = (sum(migrant_grp == "Migrant workers", na.rm = TRUE) / n()) * 100, prop_Domestic_workers = (sum(migrant_grp == "Domestic workers", na.rm = TRUE) / n()) * 100 ) %>% pivot_longer( cols = starts_with("prop_") & !prop_total_migration, names_to = "migrant_group", values_to = "percentage", names_prefix = "prop_" )
转换后的数据结构示例:
| party_name | prop_total_migration | migrant_group | percentage |
|---|---|---|---|
| 政党A | 25.0 | Immigrants | 10.0 |
| 政党A | 25.0 | Higher_paid_workers | 5.0 |
| ... | ... | ... | ... |
内容的提问来源于stack exchange,提问作者nae890
相关产品推荐
相关产品推荐

