今天学习数据分析,数据抽样这一块,用Excel如果用Data Analysis,很容易做出,python也很容易。
但Power query中并无此函数,只有一次的Number.RandomBetween这个函数取一次样。
查了一下网上的这个多次取样的方案,几乎都是使用 List.Transform嵌套多次抽样,但这样有个问题,抽样的数据可能重复。
有种方法是,多次抽样,List.Distinct后,使用截取前n项得到想要的,个人感觉这样做不科学,如果100个数据,想抽样50甚至更多,有可能最后的数据没有50个,或者100.
现在我有个思路,就是 随机挑选一个后,就在列表种将此元素移除,然后对剩下的列表继续处理。使用递归的方法。
经过多次试验调试,终于成功。
- let
fx = (lst,n) => [f = List.RemoveRange(lst,Number.Round(Number.RandomBetween(1,List.Count(lst)-1)),1),r = (
if n = 1 then
{lst{Number.Round(Number.RandomBetween(1,List.Count(lst)-1))}}
else @fx(f,n-1)[r]&{f{Number.Round(Number.RandomBetween(1,List.Count(@fx(f,n-1)[f])-1))}}
)
],
Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content][商品编号],
A = fx(Source,4)[r]
in
A
复制代码 |