如何用R语言比较单篇文章总提及人数与女性提及人数?
问题描述
我有一份按文章索引(Index)区分的数据集,包含姓名(Name)、性别(Gender)、角色(Role)字段,数据示例如下:
| Index | Name | Gender | Role |
|---|---|---|---|
| 1 | A | M | Quoted |
| 1 | B | M | Quoted |
| 2 | C | M | Quoted |
| 2 | D | F | Quoted |
| 2 | A | F | Mentioned |
| 3 | E | M | Quoted |
同一索引对应同一篇文章,姓名可跨文章重复。我希望分析单篇文章中被引用/提及的总人数与女性人数的关系,计划用散点图展示:当文章提及人数越多,女性出现概率越高或相反的趋势。
我尝试了以下代码:
data %>% group_by(index) %>% count(name) %>% tally()
但生成的数据集不含性别信息,无法用于包含性别维度的绘图。
我又尝试了这段代码:
data %>% group_by(index, gender) %>% count(index)
它会按索引和性别分别统计,但我不清楚如何绘制图表来对比每个索引对应的总提及人数与女性人数,这种方式是否可行?
解决方案
核心是先对同一文章里的重复姓名去重,再统计每篇文章的总人数和女性人数,这样就能直接用于散点图分析了。
1. 数据预处理
先处理重复数据,再按文章索引聚合统计关键指标:
library(dplyr) library(ggplot2) # 去重:同一篇文章里同一个人只算一次 processed_data <- data %>% distinct(Index, Name, .keep_all = TRUE) %>% # 按索引分组,计算总人数、女性人数、女性占比 group_by(Index) %>% summarise( total_people = n(), female_count = sum(Gender == "F", na.rm = TRUE), female_ratio = female_count / total_people ) %>% ungroup()
这里distinct()用来剔除同一文章下重复出现的姓名,避免重复统计同一个人;summarise()一次性算出我们需要的三个指标,方便后续绘图。
2. 绘制散点图
展示总人数与女性人数的关系
ggplot(processed_data, aes(x = total_people, y = female_count)) + geom_point(size = 3) + geom_smooth(method = "lm", se = FALSE, color = "red") + # 添加线性趋势线 labs( x = "单篇文章提及总人数", y = "单篇文章提及女性人数", title = "文章提及总人数与女性人数的关系" ) + theme_minimal()
展示总人数与女性出现概率(占比)的关系
如果更关注“概率”趋势,用女性占比作为Y轴更合适:
ggplot(processed_data, aes(x = total_people, y = female_ratio)) + geom_point(size = 3) + geom_smooth(method = "lm", se = FALSE, color = "blue") + labs( x = "单篇文章提及总人数", y = "女性提及占比", title = "文章提及总人数与女性出现概率的关系" ) + theme_minimal()
关于你之前代码的说明
你第二段代码的问题在于,没有处理重复姓名的情况,而且统计结果是按索引+性别拆分的,每个索引会分成两行(男/女),没法直接在散点图里把总人数和女性人数放在同一组数据点里。用上面的预处理方式,每个索引对应一行数据,包含所有需要的指标,直接就能用来做趋势分析。
内容的提问来源于stack exchange,提问作者Beanbon
相关产品推荐
相关产品推荐

