需要帮助来修复这段代码,我试着为每当前行的多行和列计算重复数。
这是我能想到的最简单的
Table.AddColumn(Source, "Add",
each List.Count(
Table.SelectRows(
Source,
(C) => List.Intersect(Table.ToList(Source),C(Table.ToList(Source)))=5
)[Column1]
))
它有以下错误-
Expression.Error: We cannot convert a value of type Record to type Function.
Details:
Value=Record
Type=Type
以下是代表性数据示例:
+---------+---------+---------+---------+---------+---------+----------------+--------------------+
| Column1 | Column2 | Column3 | Column4 | Column5 | Column6 | Count of Dup 5 | Comments |
+---------+---------+---------+---------+---------+---------+----------------+--------------------+
| 1 | 12 | 17 | 25 | 27 | 39 | 2 | -row line 1 and 2 |
| 1 | 12 | 17 | 25 | 27 | 44 | 2 | -row line 1 and 2 |
| 98 | 99 | 100 | 101 | 102 | 103 | 1 | -only current line |
+---------+---------+---------+---------+---------+---------+----------------+--------------------+
发布于 2019-06-19 16:25:26
List.Intersect并不适合计算重复行,因为此函数只返回比较列表的所有中常见的项,并且只返回一次这些项。
下面的三个选项基本上都是一样的,只是方法略有不同。
我们添加一个接受当前记录的计算列,筛选整个数据集以查找具有相同值的记录(Table.SelectRows / List.Select),并对筛选的结果(Table.RowCount / List.Count )进行计数。
由于具有相同值的两个记录不被视为相等,因此必须首先将两个要比较的记录转换为列表,方法是对每条记录调用Record.ToList,或者对整个数据集调用Table.ToRows。
选项1
在比较期间将每个表行转换为列表。
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
Dupes = Table.AddColumn(Source, "Dupes", (CurrentRecord) =>
Table.RowCount(
Table.SelectRows(Source, (CompRecord) =>
Record.ToList(CurrentRecord) = Record.ToList(CompRecord)
)
)
)
in
Dupes
选项2
在比较之前将该表转换为列表(记录)的列表(表)。
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
Dupes = Table.AddColumn(Source, "Dupes", (CurrentRecord) =>
List.Count(
List.Select(Table.ToRows(Source), (CompRecordAsList) =>
Record.ToList(CurrentRecord) = CompRecordAsList
)
)
)
in
Dupes
选项3
在比较和使用变量之前,将表转换为列表(记录)的列表(表),以避免重复调用Record.ToList
。
我不知道Record.ToList
有多贵。对于大型数据集,这可以提高性能。
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
Dupes = Table.AddColumn(Source, "Dupes", (CurrentRecord) =>
let
CurrentRecordAsList = Record.ToList(CurrentRecord),
ReturnValue = List.Count(
List.Select(Table.ToRows(Source), (CompRecordAsList) =>
CurrentRecordAsList = CompRecordAsList
)
)
in
ReturnValue
)
in
Dupes
根据注释中的说明进行编辑
选项4
查找与列无关的通用值。
由于您只对n
列中的n-m
列值完全相等的行进行计数,因此我们确实可以使用List.Intersect而不是直接的相等比较。
下面的方法基于选项3,但在所有三种情况下都是一样的。我们将CurrentRecordAsList = CompRecordAsList
替换为对这两个列表上的List.Intersect
的调用(其中每个列表表示单个记录,即每个列表项表示其中一列中的值),计算公共项的数量,并与n-m
(在本例中为5
)进行比较。
注意#1:所有列都匹配的项不再计算在内,这意味着结果数现在只表示其他记录。在相等比较中计数的当前记录不包括在内。
相等比较:1
表示没有重复(只找到自己)
Intersec比较:1
表示已找到另一条记录
注意#2:这不会检查比较的记录中的公共值是否在相同的列中。只是这些值出现在两个记录中的某个位置。
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
Dupes = Table.AddColumn(Source, "Dupes", (CurrentRecord) =>
let
CurrentRecordAsList = Record.ToList(CurrentRecord),
ReturnValue = List.Count(
List.Select(Table.ToRows(Source), (CompRecordAsList) =>
List.Count(List.Intersect({CompRecordAsList, CurrentRecordAsList})) = 5
)
)
in
ReturnValue
)
in
Dupes
选项5
如果您还需要检查常用值是否在相同的列中,则List.Intersect
不再有用。
下面发生的事情遵循与之前相同的方法。我们添加一个计算列,该列获取当前记录,筛选完整的数据集,并对筛选的记录进行计数。只是过滤条件现在稍微复杂了一点。
用于筛选dataset的自定义函数使用Table.ColumnNames获取列名列表,通过使用Record.Field筛选此列表(List.Select)以比较两个记录的相应列,对生成的公共列(List.Count)进行计数,并将其与阈值n-m
(例如5
)进行比较。
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
Dupes = Table.AddColumn(Source, "Dupes", (CurrentRecord) =>
Table.RowCount(
Table.SelectRows(Source, (CompRecord) =>
List.Count(
List.Select(Table.ColumnNames(Source), (ColumnName) =>
Record.Field(CurrentRecord, ColumnName) = Record.Field(CompRecord, ColumnName)
)
) = 5
)
)
)
in
Dupes
https://stackoverflow.com/questions/56659597
复制相似问题