如何用R统计逗号分隔的英雄联盟英雄标签分组条目数
英雄联盟英雄标签统计的更优实现
原始数据集
| name | tags |
|---|---|
| Aatrox | Fighter |
| Ahri | Mage,Assassin |
| Akali | Assassin |
| Akshan | Marksman,Assassin |
| Alistar | Tank,Support |
需求
统计每个标签对应的英雄总数
现有实现(新手方案)
使用的包:
library(tidyverse) library(janitor)
步骤及代码:
- 将标签拆分为不同列
lol_champions_tags <- lol_champions_clean %>% select(name, tags) %>% separate(tags, sep = ',', into = paste0('tag', 1:2))
- 分别统计各标签列的条目数
lol_champions_tags %>% select(name, tag1) %>% group_by(tag1) %>% summarise(N = n()) -> tag1 lol_champions_tags %>% select(name, tag2) %>% drop_na() %>% group_by(tag2) %>% summarise(N = n()) -> tag2
- 合并结果并计算总数
champions_per_tag <- bind_cols(tag1, tag2) %>% clean_names() %>% select(tag1,n_2,n_4) %>% mutate(total_entries = n_2 + n_4) %>% select(tag1, total_entries)
更优实现方案
不需要拆分多列再合并,用tidyr的separate_rows()函数可以直接将每个标签拆成独立行,之后直接分组统计即可,代码更简洁且扩展性更强(比如英雄有3个标签的情况也能处理):
library(tidyverse) champions_per_tag <- lol_champions_clean %>% select(name, tags) %>% # 将逗号分隔的标签拆分为多行,每行对应一个标签 separate_rows(tags, sep = ",") %>% # 按标签分组统计数量 group_by(tags) %>% summarise(total_entries = n())
运行后得到的结果:
| tags | total_entries |
|---|---|
| Assassin | 3 |
| Fighter | 1 |
| Mage | 1 |
| Marksman | 1 |
| Support | 1 |
| Tank | 1 |
这个方法的优势:
- 无需提前预判标签列的数量(比如如果有英雄有3个标签,原方法需要手动调整拆分列数,而这个方法自动适配)
- 代码步骤更少,逻辑更清晰,避免了拆分多列后合并的繁琐操作
- 仅依赖
tidyverse即可完成统计,无需额外引入janitor包
内容的提问来源于stack exchange,提问作者Hiram Méndez
相关产品推荐
相关产品推荐

