R语言如何统计数据框中带分隔符列的各字符串出现频次
拆分分隔字符串统计元素频次实现方案
核心处理逻辑共3步:
- 清洗原始字符串:统一把逗号后附带的空格去掉,避免同值因为前后空格被识别为不同项
- 拆分字符串:按逗号作为分隔符,把每个单元格内的多个值拆分为独立行,每个值关联原ID
- 分组计数:对拆分后的独立值做去重计数,输出「字符串」「频次」两列结果
以下是不同常用场景的具体实现代码:
SQL实现(兼容MySQL8.0+/Hive/Spark SQL等支持递归CTE的引擎)
-- 生成连续序号用于字符串拆分,序号最大值需大于单条字符串最多可拆分出的元素个数 WITH RECURSIVE seq AS ( SELECT 1 AS pos UNION ALL SELECT pos + 1 FROM seq WHERE pos < 100 ), split_tmp AS ( SELECT DISTINCT t.ID, SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(t.str_col, ', ', ','), ',', s.pos), ',', -1) AS item FROM your_table t -- 把your_table替换成你的实际表名,str_col替换成你的带分隔符的字符串列名 JOIN seq s ON s.pos <= LENGTH(REPLACE(t.str_col, ', ', ',')) - LENGTH(REPLACE(REPLACE(t.str_col, ', ', ','), ',', '')) + 1 ) SELECT item AS `字符串`, COUNT(ID) AS `频次` FROM split_tmp WHERE item != '' -- 过滤空值 GROUP BY item ORDER BY 频次 DESC;
基于你给出的示例数据,运行后输出结果为:
| 字符串 | 频次 |
|---|---|
| B02 | 3 |
| C03 | 3 |
| A01 | 2 |
| D04 | 2 |
| E05 | 2 |
如果使用ClickHouse、PostgreSQL等自带数组拆分函数的引擎,代码可以更简洁,以ClickHouse为例:
SELECT item AS `字符串`, COUNT(DISTINCT ID) AS `频次` FROM your_table ARRAY JOIN splitByChar(',', replaceAll(str_col, ', ', ',')) AS item WHERE item != '' GROUP BY item ORDER BY 频次 DESC;
Python Pandas实现(数据处理场景)
import pandas as pd # 替换成你的实际数据源 df = pd.DataFrame({ "ID": [1, 2, 3], "str_col": ["A01,B02,C03", "A01,B02,C03,D04,E05", "B02, C03, D04, E05"] }) result = ( df["str_col"] .str.replace(", ", ",", regex=False) # 清洗逗号后的空格 .str.split(",") # 按逗号拆分字符串为列表 .explode() # 把列表元素拆分为独立行 .value_counts() .reset_index() .rename(columns={"index": "字符串", "str_col": "频次"}) ) print(result)
运行结果和SQL版本完全一致。
Excel/ WPS表格实现(轻量办公场景)
- 第一步:字符串清洗:选中字符串列,按
Ctrl+H调出查找替换窗口,查找内容输入,(逗号+空格),替换为输入,,点击全部替换 - 第二步:分列:选中字符串列,点击顶部菜单栏「数据」-「分列」,选择分隔符号为逗号,完成拆分,让每个独立值占单独单元格
- 第三步:合并单列:如果是365/2021及以上版本,直接输入公式
=TOCOL(拆分后的数据区域,1)即可把所有拆分出的值合并为单列,自动忽略空值 - 第四步:计数:选中合并后的值列,插入数据透视表,把该列字段分别拖到「行」区域和「值」区域,值字段设置为计数,即可直接得到统计结果。
内容的提问来源于stack exchange,提问作者CopperheaD
相关产品推荐
相关产品推荐

