【问题标题】:Sum if frequency countif unique cells如果频率计数唯一单元格,则求和
【发布时间】:2015-06-26 16:24:03
【问题描述】:

我们在系统中接到电话,人们按手机上的菜单键。

我们不想计算重复调用。这个公式有效。

我们希望公式忽略少于 60 秒的调用。

我只希望函数在 C 列中的行

这是我的功能:

=SUM(--(FREQUENCY(IF(($B$1:$B$94={"1,1"}),COUNTIF($A$1:$A$94,"<"&$A$1:$A$94),""),COUNTIF($A$1:$A$94,"<"&$A$1:$A$94))>0))

数据如下:

       A           B      C
(888) 208-0980    1,1    479
(888) 208-0980    1,1    479
(888) 208-0980    1,1    60
(888) 208-0980    1,2    50
(888) 540-7272    1,4    10

这是截图:

这是一个数组,所以当你复制它时,你需要按 Ctrl + Shift + Enter

该函数只计算给定约束的数字的一个实例。我想添加另一个约束条件,即如果 C 大于 60。

【问题讨论】:

  • 你是怎么想出原始公式的?您尝试更改什么以使其执行其他任务?哪里出了问题?
  • 我通过反复试验和阅读论坛来模仿公式。一切正常,除了我只希望它在 C 列中的时间超过 60 时运行的情况
  • @calebcjb 但是您尝试在该条件公式中添加什么?您是否尝试过另一个 IF 语句?
  • 是的,我有,我无法让它工作。我不知道为什么。
  • @calebcjb 好的,您能告诉我们您尝试过的什么吗?我也不知道为什么,因为我不知道你尝试了什么......

标签: excel unique frequency countif


【解决方案1】:

好的,这是一个地狱般的公式,确实需要一些解构。

=COUNTIF($A$1:$A$94,"&lt;"&amp;$A$1:A$94) 短语生成一个长度为 94 的数组,等于 {0,1,2,...,93}except 其中$A$1:$A$94 中的对应电话号码与之前的号码重复(向下阅读 A 列时),对应的使用第一次出现的数字的数组值。因此,例如,数字“(888) 941-1960”在 A 列的第 11、12 和 13 行出现了 3 次。第 11 个数组元素对应于该数字的第一次出现(在 A11 中),其值为 10 . 这个值在数组的第十二和十三个元素中重复出现,反映了A12和A13中的重复值。数组中不同值的数量与 $A$1:$A$94 中不同电话号码的数量相匹配,我将使用 PhoneIndex 作为该数组的简写。

重写的IF 部分是IF($B1:$B94={"1,1"},PhoneIndex,"")。这是一个长度为 94 的数组,它简单地将 PhoneIndex 的元素替换为长度为零的字符串,其中 B 列中的相应条目不是 "1,1"。我将使用PhoneIndex2 作为第二个数组的简写。

重写的FREQUENCY 部分是FREQUENCY(PhoneIndex2, PhoneIndex)。 FREQUENCY 函数的一个未记录的特性是,如果值在第二个参数(所谓的 Bins_array)中重复,则忽略重复项并将 Bins_array 中的相应频率值设置为零。 PhoneIndex 对应于 $A$1:$A$94 中的所有电话号码(有重复),因此该函数提供第三个数组(长度还是 94),其元素对应于$A$1:$A$94 中的电话号码,并提供频率计数在按下 1,1 的数组中与重复电话号码相对应的任何元素的值为零的情况下,从该号码拨打电话的次数中。我将此数组称为CallCount

公式的其余部分归结为{=SUM(--(CallCount&gt;0))}。根据来自$A$1:$A$94 中相应电话号码的任何呼叫是否与"1,1" 中的"1,1" 相关联,布尔比较将CallCount 中的频率值数组转换为包含TrueFalse 值的数组B 列。双重否定将布尔数组转换为 1 和 0 的数组,然后可以求和。布尔比较和双重否定确保大于 1 的频率计数被转换为值 1 以用于求和。这是在最终结果中排除重复调用的机制。

解构公式后,我现在转而对其进行修改以排除少于 60 秒的调用。显而易见的起点是IFpart。我最初的想法是修改它的第一个参数并使其类似于

AND($B$1:$B$94={"1,1"}, $C$1:$C$94&gt;=60)

但是,尽管在语法上有效,但它提供了一个数组,其元素要么全部为True,要么全部为False——后者是迄今为止最有可能的结果。我将把它留作练习,让读者弄清楚为什么这两个观察结果都成立。

当然,真正需要的是组合两个布尔数组($B$1:$B$94={"1,1"}$C$1:$C$94&gt;=60)以产生一个长度为 94 的数组,其中每个元素相当于对两个对应的元素执行 AND 操作每个输入数组中的元素。

一个解决方案是

1=((1*($B$1:$B$94={"1,1"}))*(1*($C$1:$C$94&gt;=60)))

但毫无疑问还有其他人。 1*'s 将每个布尔数组转换为 1 和 0 的数组(它是我在原始公式中使用双重否定来完成相同转换工作的首选替代方法)。这两个数组在相应的元素基础上相乘,得到一个长度为 94 的“乘积数组”,该数组也包含 1 和 0。然后通过1= 位将该数组转换回TrueFalse 元素的数组。生成的布尔数组有 94 个元素,并且由于它的构造方式,它的元素具有所需的属性。 (有数学头脑的读者会认识到这里利用同构来绕过 Excel 在数组公式中使用 AND 的行为。)

将上述替换为原始公式中IF() 函数的第一个参数应该可以解决问题。

最后一个观察:使用 Excel 的名称管理器可以简化很长的公式。在定义名称时使用公式是完全有效的,因此可以在名称管理器中定义PhoneIndex,如上所述。名称也可以在其定义中使用其他名称,因此提供了定义PhoneIndex2CallCount 的简单方法。最终,电话公式可以更简洁地写成=SUM(--(CallCount&gt;0))。合理地使用命名可以用来展示一个复杂的公式是如何由单个元素构成的,并且可以大大减轻理解公式打算做什么的负担——在这种情况下,公式需要更改时很有用。

【讨论】:

    猜你喜欢
    • 2023-01-08
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多