首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何修复每行多列重复计数的代码?

如何修复每行多列重复计数的代码?
EN

Stack Overflow用户
提问于 2019-06-19 11:23:11
回答 1查看 124关注 0票数 0

需要帮助来修复这段代码,我试着为每当前行的多行和列计算重复数。

这是我能想到的最简单的

代码语言:javascript
复制
Table.AddColumn(Source, "Add",
each List.Count(
Table.SelectRows(
    Source,
    (C) => List.Intersect(Table.ToList(Source),C(Table.ToList(Source)))=5
)[Column1]
))

它有以下错误-

代码语言:javascript
复制
Expression.Error: We cannot convert a value of type Record to type Function.
Details:
    Value=Record
    Type=Type

以下是代表性数据示例:

代码语言:javascript
复制
+---------+---------+---------+---------+---------+---------+----------------+--------------------+
| 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 |
+---------+---------+---------+---------+---------+---------+----------------+--------------------+
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-19 16:25:26

List.Intersect并不适合计算重复行,因为此函数只返回比较列表的所有中常见的项,并且只返回一次这些项。

下面的三个选项基本上都是一样的,只是方法略有不同。

我们添加一个接受当前记录的计算列,筛选整个数据集以查找具有相同值的记录(Table.SelectRows / List.Select),并对筛选的结果(Table.RowCount / List.Count )进行计数。

由于具有相同值的两个记录不被视为相等,因此必须首先将两个要比较的记录转换为列表,方法是对每条记录调用Record.ToList,或者对整个数据集调用Table.ToRows

选项1

在比较期间将每个表行转换为列表。

代码语言:javascript
复制
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

在比较之前将该表转换为列表(记录)的列表(表)。

代码语言:javascript
复制
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有多贵。对于大型数据集,这可以提高性能。

代码语言:javascript
复制
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:这不会检查比较的记录中的公共值是否在相同的列中。只是这些值出现在两个记录中的某个位置。

代码语言:javascript
复制
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)进行比较。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56659597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档