在R中重塑数据用于网络分析:如何生成伙伴关系表?
解决方案:将宽格式合作表转换为关系对表
针对你需要将同一项目下的合作伙伴生成两两关系对的需求,以下提供几种常用工具的实现方法:
1. Python Pandas 代码实现
适合处理大规模数据,步骤清晰可复用:
import pandas as pd from itertools import combinations # 加载原始数据(实际使用时可替换为pd.read_csv/pd.read_excel) raw_data = pd.DataFrame({ 'project ID': [1, 2, 3], 'partner 1 ID': ['P01', 'P02', 'P01'], 'partner 2 ID': ['P02', 'P04', 'P03'], 'partner 3 ID': ['P03', None, 'P04'] }) # 将宽表转换为长表,过滤空值合作伙伴 long_format = raw_data.melt( id_vars='project ID', value_name='partner' ).drop(columns='variable').dropna() # 按项目分组,生成所有不重复的两两合作伙伴关系对 result = long_format.groupby('project ID')['partner'].apply( lambda partners: pd.DataFrame( list(combinations(partners, 2)), columns=['Relation partner to', 'Relation partner from'] ) ).reset_index().drop(columns='level_1') # 输出结果 print(result)
这段代码会直接生成你需要的关系表结构,combinations函数确保只生成单向不重复的关系对,和示例输出完全匹配。
2. Excel Power Query 操作步骤
适合非代码用户,可视化操作:
- 第一步:将原始数据转换为长表
复制原始表的project ID列和所有partner列,整理成两列:project ID和partner,删除空行。 - 第二步:用Power Query生成关系对
- 选中整理后的长表,点击「数据」选项卡 → 「从表格/区域」进入Power Query编辑器
- 点击「转换」选项卡 → 「分组依据」,分组列选
project ID,操作选「所有行」,新列名设为AllRows - 添加自定义列,公式输入:
List.Combinations([AllRows][partner], 2) - 点击自定义列右侧的展开按钮,展开所有组合;再展开每个组合的两个元素,分别重命名为
Relation partner to和Relation partner from - 删除多余列,点击「关闭并上载」,即可得到目标关系表
3. SQL 实现(适用于数据库存储的数据)
如果数据存储在数据库中,可通过以下SQL语句生成结果:
WITH long_partners AS ( -- 将宽表转换为长表,过滤空值 SELECT project_id, partner1 AS partner FROM project_partners WHERE partner1 IS NOT NULL UNION ALL SELECT project_id, partner2 AS partner FROM project_partners WHERE partner2 IS NOT NULL UNION ALL SELECT project_id, partner3 AS partner FROM project_partners WHERE partner3 IS NOT NULL ) -- 自连接生成不重复的关系对 SELECT l1.project_id AS "project ID", l1.partner AS "Relation partner to", l2.partner AS "Relation partner from" FROM long_partners l1 INNER JOIN long_partners l2 ON l1.project_id = l2.project_id AND l1.partner < l2.partner -- 避免生成反向重复的关系对 ORDER BY l1.project_id, l1.partner, l2.partner;
内容的提问来源于stack exchange,提问作者Caroline Corbieres
相关产品推荐
相关产品推荐

