ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 736|回复: 14

[求助] 求助,求教PowerQuery怎么把包含相同元素的数据分成同1组

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-10-17 21:12 | 显示全部楼层 |阅读模式


1.png 2.png
如上图所示,图1带颜色的受感染者是原数据,图2同一传播链是想要的结果,
图中假设首先是序号2的A感冒了,然后传给了B,B又传给了序号3的C,C又传给了序号5的Z、D,然后D又传给了序号1的E、F
因为序号2、3都包含B,分到了1组,(2+3)小组紧接着又和都包含C的序号5分为了1组,再和包含同类项D的序号1分为了1组,总之就是包含相同元素的分为一组能形成串联关系的也分到1组得到整个传播链的成员
求教,这个可以用PowerQuery做出来么,万分感谢!!

传播数据.rar

9.59 KB, 下载次数: 44

TA的精华主题

TA的得分主题

发表于 2023-10-19 09:34 | 显示全部楼层
本帖最后由 Karrytt 于 2023-10-19 09:36 编辑

用text.split。 image.png



let
    源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    提升的标题 = Table.PromoteHeaders(源, [PromoteAllScalars=true]),
    已添加自定义 = Table.AddColumn(提升的标题, "处理", each Table.FromColumns({Text.Split([时间序号],"、"),Text.Split([受感染者],";")})),
    #"展开的“处理”" = Table.ExpandTableColumn(已添加自定义, "处理", {"Column1", "Column2"}, {"处理.Column1", "处理.Column2"}),
    删除的列 = Table.RemoveColumns(#"展开的“处理”",{"时间序号", "受感染者"}),
    重命名的列 = Table.RenameColumns(删除的列,{{"处理.Column1", "时间序号"}, {"处理.Column2", "受感染者"}})
in
    重命名的列

TA的精华主题

TA的得分主题

发表于 2023-10-19 10:22 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-10-19 19:00 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
飞天篮球猪 发表于 2023-10-19 10:22
非主流解法,仅供参考。

感谢帮助,请问PowerQuery有方法么,这个我看不懂...

TA的精华主题

TA的得分主题

发表于 2023-10-19 20:23 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
果子麦子 发表于 2023-10-19 19:00
感谢帮助,请问PowerQuery有方法么,这个我看不懂...

供参考。效率不高,只是解题,都是全表遍历。

方法1:List.Accumulate
2023-10-19_201921.jpg
方法2:Table.Group+递归,分组归类
2023-10-19_202027.jpg

评分

5

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-10-19 23:08 | 显示全部楼层
本帖最后由 果子麦子 于 2023-10-20 08:54 编辑
飞天篮球猪 发表于 2023-10-19 20:23
供参考。效率不高,只是解题,都是全表遍历。

方法1:List.Accumulate
感谢大神提供的循环思路,很值得学习,非常感谢,我再研究研究!!

TA的精华主题

TA的得分主题

发表于 2023-10-24 07:56 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-10-27 22:08 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-10-28 07:46 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
果子麦子 发表于 2023-10-27 22:08
感谢帮助,请问是什么语言

这个是WPS的JS宏

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-10-29 19:34 | 显示全部楼层

厉害!
用了好多高级技巧!
js正在入门中,学习并初步解析:
先贴一下代码:
  1. function run(){
  2.         const arr =Range("B2:C7").Value2.map(v => [[v[0]], [v[1].split(/、/g)]])
  3.         const update =(x, i)=> {
  4.                 if(!(x in arr)) return arr[x] = i                                                        //标记索引
  5.                 let j = arr[x]                                                                                                //之前数据的索引
  6.                 if(j == i || arr[j] == null) return                                                        //是否已被处理
  7.                 arr[j].forEach((a, y) => a.forEach(v => arr[i][y].push(v)))        //取得后面的时间序号和受感染者
  8.                 arr[i][1].forEach(xArr => xArr.forEach(a => arr[a] = i))        //更新状态
  9.                 arr[j] = null                                                                                                //清空之前的数据,做个标记
  10.         }
  11.         arr.reduceRight((_, v, i) => v[1].forEach(xArr => xArr.forEach(x => update(x, i))), null) //逆推求值
  12.         const res =arr.reduce((res, v,i) => {
  13.                 v && res.push([v[0].join("、"), v[1].map(v => v.join("、")).join(";")])        //短路求值
  14.                 return res
  15.         }, [["时间序号", "同一个传播链"]])
  16.         Range("F16").Resize(res.length, 2).Value2 = res
  17. }
复制代码
经第2行代码map函数后,构造了一个新数组 arr :
  1. [
  2.         [        [1],[["E","D","F"]]        ],
  3.         [        [2],[["A","B"]]        ],
  4.         [        [3],[["B","C"]]        ],
  5.         [        [4],[["N","R","P","Y"]]        ],
  6.         [        [5],[["Z","C","D"]]        ],
  7.         [        [6],[["M","P","R","X"]]        ]
  8. ]
复制代码
第11行代码为求解,其中引用了第3行定义的 update(x,i)函数,求解后,arr 数组变为如下:
  1. [
  2.         [        [1,2,3,5], [ ["E","D","F"], ["A","B"], ["B","C"], ["Z","C","D"] ]        ],
  3.         null,
  4.         null,
  5.         [        [4,6], [["N","R","P","Y"], ["M","P","R","X"]]        ],
  6.         null,
  7.         null
  8. ]
复制代码
最后,通过第12行代码,把arr数组转换为res数组
  1. [
  2.         ["时间序号",        "同一个传播链"],
  3.         ["1、2、3、5", "E、D、F;A、B;B、C;Z、C、D"],
  4.         ["4、6",        "N、R、P、Y;M、P、R、X"]
  5. ]
复制代码
第16行代码,把res数组写入Excel表格指定区域。


您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-1 19:34 , Processed in 0.054127 second(s), 19 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表