如何使用COUNTIF函数仅计算唯一值?

3

example

我有一个数据集,其中一列是参考文献。参考文献的格式始终相同,为"1-XXX-YYY"。XXX始终是三个字母,YYY始终是一个数字。每个XXX都会有YYY=001,如果有相同XXX的其他类型,就会有YYY=002,依此类推。
我想知道每种类型的参考文献有多少个。但是,如果文档中的参考文献重复出现,应该只计算为1个。
我尝试过使用COUNTIF函数,但显然它不能正常工作。
正如您在示例中所看到的,XYZ参考文献被计算为有2个不同的条目。但实际上只有1-XYZ-001,并且它出现了两次。
在我的示例中,我应该使用什么公式,以便XYZ显示为1,而其他的保持其值不变?
我看到了类似问题的解决方案,但在这个问题中,我的计数条件只是参考文献的一部分,我认为这会搞乱类似this的东西。
6个回答

6
尝试以下方法,这不需要LAMBDA()辅助函数。

enter image description here


• 在单元格 C2 中使用的公式
=LET(
     a,MID(UNIQUE(A2:A8),3,3),
     b,UNIQUE(a),
     c,TOROW(a),
     SORT(HSTACK(b,MMULT(N(b=c),SEQUENCE(COLUMNS(c),,,0)))))

如果你需要标题的话,那么,

enter image description here


=LET(
     a,MID(UNIQUE(A2:A8),3,3),
     b,UNIQUE(a),
     c,TOROW(a),
     VSTACK({"Type of Ref.","Count"},
     SORT(HSTACK(b,MMULT(N(b=c),SEQUENCE(COLUMNS(c),,,0))))))


只是一个快速提醒,你为XYZ生成了错误的结果 ;) - undefined
哦,是的,抱歉,我会修复的。 - undefined
最后我选择了另一个答案,但还是谢谢你的建议! - undefined

6
另一种方法可能是:
=LET(a, A2:A8,
     m, UNIQUE(MID(a,3,3)),
     u, MID(UNIQUE(a),3,3),
HSTACK(m,
       MMULT(N(TOROW(u)=m),SEQUENCE(ROWS(u),,,0))))

enter image description here

或者如果你想按字母顺序排序:
=LET(a, A2:A8,
     m, SORT(UNIQUE(MID(a,3,3))),
     u, MID(UNIQUE(a),3,3),
HSTACK(m,
       MMULT(N(TOROW(u)=m),SEQUENCE(ROWS(u),,,0))))

或者如Vbasic2008所建议的,我们可以通过使用以下方法来提高效率:
=LET(a, A2:A8,
     u, MID(UNIQUE(a),3,3),
     m, SORT(UNIQUE(u)),
HSTACK(m,
       MMULT(N(TOROW(u)=m),SEQUENCE(ROWS(u),,,0))))

1
如果你先执行 u, MID(UNIQUE(a),3,3),,然后再执行更高效的 m,SORT(UNIQUE(u)), - undefined
已将其添加到答案中。 - undefined
1
最后还是用了另一个答案,但还是谢谢你的帮助。 - undefined

5
你可以试试:

enter image description here

C2中的公式:

=LET(r,A2:A8,f,MID(r,3,3),u,SORT(UNIQUE(f)),HSTACK(u,MAP(u,LAMBDA(s,ROWS(UNIQUE(FILTER(r,f=s)))))))

我最后选择了另一个答案,但非常感谢你的建议。 - undefined

5

计算唯一字符串的子字符串数量

enter image description here

编辑

  • 我猜在学习Excel的开始阶段,人们会学到COUNT函数,即计算范围(数组)中数字的数量,实际上不必使用=SUM(N(ISNUMBER(array)))(我在编辑之前使用过)。
  • 可以简单地使用=COUNT(array)

单元格公式(向下填充)

=TOCOL(BYCOL(SEARCH(TOROW(C2:C4), UNIQUE(A2:A11)), LAMBDA(c, COUNT(c))))

公式在D2(向下复制)

=COUNT(SEARCH(C2, UNIQUE(A$2:A$11)))

Excel表格中计数列第一个单元格的公式(向下填充)
=COUNT(SEARCH([@Type], UNIQUE(Table1[Refs])))

我最终采用了你的第二个答案。非常感谢你。 - undefined

4
如果你有MS 365,你可以在D2中使用这个,并向下填充。
=ROWS(FILTER(UNIQUE($A$2:$A$8),ISNUMBER(SEARCH(C2,UNIQUE($A$2:$A$8)))))

或者作为一个单一的公式在D2中,它会自动向下填充。
=BYROW(
    $C$2:$C$4,
    LAMBDA(arr,
        ROWS(
            FILTER(
                UNIQUE($A$2:$A$8),
                ISNUMBER(SEARCH(arr, UNIQUE($A$2:$A$8)))
            )
        )
    )
)

enter image description here

根据@vBasic2008的评论,如果在C列中没有与该项目匹配的内容,公式将返回一个“#CALC!”错误。如果这可能是一个问题,请使用下面的修改,该修改使用IFERROR在这种情况下返回0而不是错误:
=BYROW(
    $C$2:$C$4,
    LAMBDA(arr,
        IFERROR(
            ROWS(
                FILTER(
                    UNIQUE($A$2:$A$8),
                    ISNUMBER(SEARCH(arr, UNIQUE($A$2:$A$8)))
                )
            ),
            0
        )
    )
)

有一个问题需要考虑:由于您只返回结果列,您并没有确保会有匹配项,所以无论FILTER返回什么,至少会有一行结果,因此结果永远不会为0。 - undefined
@VBasic2008 你试过了吗?根据我使用的数据,如果在C列中更改其中一项以确保没有匹配项,我发现公式会返回一个错误。如果有问题,可以使用IFERROR轻松进行测试。 - undefined

2
我看到很多复杂的答案。希望这个能让你的事情变得更简单:
=LET(
    data, A2:A8,
    crit, SORT(UNIQUE(TEXTBEFORE(TEXTAFTER(data, "-"), "-"))),
    HSTACK(crit,MAP(crit,LAMBDA(m, COUNT(SEARCH(m,UNIQUE(data))))))
)

enter image description here


1
我最后选择了另一个答案,但还是谢谢你的建议! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接