无论它们的顺序如何,如何检查相同的值组合

Posted

技术标签:

【中文标题】无论它们的顺序如何,如何检查相同的值组合【英文标题】:How to check same combination of values regardless of their order 【发布时间】:2013-03-26 17:16:09 【问题描述】:

我收到了一长串客户可能拥有的不同设备的组合。看起来列出列表的人所做的只是连接所有包含设备产品编号的列。问题是它们在列的填写方式上没有真正的顺序。因此,先获得设备 B 然后获得设备 A 的客户现在的价值为 B/A,而另一个客户的价值也可能为 A/B。我正在尝试使用 excel 或 SAS 来确定有多少不同的组合,无论顺序如何,所以在这种情况下 A/B=b/A 并且它们只有 1 个,而不是 2 个组合。有没有办法使用 EXCEL 或 SAS 来解决这个问题,因为现在我不得不关注它。一如既往,非常感谢您的帮助!

桑迪

【问题讨论】:

【参考方案1】:

在 SAS 中,将它们拆分为组件值,然后对变量进行排序。

data have;
length value $50;
input value $;
datalines;
GummyBears/Skittles
Skittles/GummyBears
MandMs/Skittles
GummyBears/MandMs
Skittles/MandMs
GummyBears/MandMs
;;;;
run;

data want;
set have;
length vals1 vals2 $20;
array vals[2] $;
do _t = 1 to dim(vals);
 vals[_t]=scan(value,_t,'/');
end;
call sortc(of vals[*]);
run;

proc freq data=want;
tables vals1*vals2/list;
run;

如果您愿意,也可以在之后重新组合它们。

【讨论】:

【参考方案2】:

这是在不使用 VBA 的情况下在 Excel 中提供所有独特设备组合的快速方法。

在您的组合文本旁边为每件设备插入列 - 每件设备一列 - 请参阅下面的草稿。如果设备组合包含该列的设备,则每列返回 TRUE,否则返回 FALSE。

EQUIPMENT     CONTAINS_A  CONTAINS_B  CONTAINS_C  CONTAINS_ D   Sort_Column
COMBINATION
-------------------------------------------------------------------------------------------
A/B/C         TRUE       TRUE        TRUE          FALSE        TRUETRUETRUEFALSE
B/A/D/C       TRUE       TRUE        TRUE          TRUE         TRUETRUETRUETRUE
A/B           TRUE       TRUE        FALSE         FALSE        TRUETRUEFALSEFALSE
C             FALSE      FALSE       FALSE         TRUE         FALSEFALSETRUEFALSE

最后一列将文本中的所有 TRUE/FALSE 值组合在一起。可以过滤和/或排序此文本以轻松识别唯一组合。如果您应用自动过滤器,自动过滤器中的条目将显示唯一的组合。

这些是我在值后面使用的公式(在第 2 行中显示公式):

CONTAINS A: =NOT(ISERROR(SEARCH("A",F2,1)))
CONTAINS B: =NOT(ISERROR(SEARCH("B",F2,1)))
CONTAINS C: =NOT(ISERROR(SEARCH("C",F2,1)))
CONTAINS D: =NOT(ISERROR(SEARCH("D",F2,1)))

排序列:=TEXT(H2,"#") & TEXT(I2,"#") & TEXT(J2,"#") & TEXT(K2,"#")

很抱歉这个格式,但我不能发布图片:-( 希望能帮助到你!

【讨论】:

【参考方案3】:

您可以使用条件格式来突出显示重复选项。它仍然会盯着它看,但您可能会按颜色分类以查看匹配/不匹配的设备。

可以在此处找到有关如何执行此操作的示例:http://www.techrepublic.com/blog/window-on-windows/how-to-find-duplicates-in-excel/7347

【讨论】:

【参考方案4】:

您可以尝试编写一些可在 Excel 中使用的 VBA 代码来更改 A 和 B 在列中的显示方式。例如,对于 B/A,它将按字母顺序排列,然后将其更改为 A/B。对于 A/B,由于它已经按字母顺序排列,因此将保持原样。完成此操作后,然后按该列对工作表进行排序。然后,您应该会看到像 A/B 这样的数据,并且下一行也可能显示 A/B。接下来,根据您的需要,您可以添加更多 VBA 代码以按该类型的列组合行并将该数据写入新工作表。这将为您提供所有客户拥有的所有唯一设备类型集的唯一计数。如果您想要拥有 A/B/C 的客户的唯一数量,并将 A/B 部分与仅拥有 A/B 的其他客户结合起来,那么这将是更多的工作。

【讨论】:

【参考方案5】:

我有时间为您整理了一个 Excel 公式。请参阅此帖子底部的原始 cmets,以获取指向我的来源的链接。

解决此问题的步骤:

用户定义函数对单元格进行排序

在 Excel VBA 中创建一个新模块(如果您需要这方面的说明,请告诉我,只需点击几下)

复制并粘贴以下所有代码。

Option Explicit

Const c_Separator = "/"
' User Defined Function to split a list within a cell and then sort it 
' before recreating a sorted list
Public Function CellSort(strString As String) As String
    Dim i As Integer
    Dim arr As Variant
    Dim strRet As String
    arr = Split(strString, c_Separator)

    ' trim values so sort will work properly
    For i = LBound(arr) To UBound(arr)
        arr(i) = Trim(arr(i))
    Next i

    ' sort
    QuickSort arr, LBound(arr), UBound(arr)

    ' construct ordered list to return
    For i = LBound(arr) To UBound(arr) - 1
        strRet = strRet & CStr(arr(i)) & c_Separator
    Next i

    ' Attach the last item separately to avoid adding an unecessary separator
    CellSort = strRet & CStr(arr(i))

End Function


' Quick Sort function found here: 
' https://***.com/questions/3399823/excel-how-do-i-sort-within-a-cell
Public Sub QuickSort(vArray As Variant, inLow As Long, inHi As Long)

  Dim pivot   As Variant
  Dim tmpSwap As Variant
  Dim tmpLow  As Long
  Dim tmpHi   As Long

  tmpLow = inLow
  tmpHi = inHi

  pivot = vArray((inLow + inHi) \ 2)

  While (tmpLow <= tmpHi)

     While (vArray(tmpLow) < pivot And tmpLow < inHi)
        tmpLow = tmpLow + 1
     Wend

     While (pivot < vArray(tmpHi) And tmpHi > inLow)
        tmpHi = tmpHi - 1
     Wend

     If (tmpLow <= tmpHi) Then
        tmpSwap = vArray(tmpLow)
        vArray(tmpLow) = vArray(tmpHi)
        vArray(tmpHi) = tmpSwap
        tmpLow = tmpLow + 1
        tmpHi = tmpHi - 1
     End If

  Wend

  If (inLow < tmpHi) Then QuickSort vArray, inLow, tmpHi
  If (tmpLow < inHi) Then QuickSort vArray, tmpLow, inHi

End Sub

关闭 VBA 编辑器(不再需要编码)。

计算唯一组合数的 Excel 公式 在 Excel 中,您在原始数据列旁边创建三列。我在下面的屏幕截图中用彩色背景显示了这些公式。每个都在图片下方进行了解释。

蓝色列:使用上面的 VBA 函数对原始列表中每个单元格的内容进行排序,这给出了一个一致的列表,您可以在其中计算唯一项目。如果您的原始列表中有一些小写实例和其他大写实例,并且您需要将它们视为相同,则将此列中的公式修改为=CellSort(UPPER(A2))

绿色列:简单的COUNTIF 函数(适用于所有最新的 Excel 版本),用于标识每个已排序单元格的第一个实例。

红色单元格:计算 TRUE 在绿色列中出现的次数。这给出了唯一条目的计数。

以下是已完成作品的示例。


原创cmets

恐怕我现在没有时间对此进行测试,但这可能会对您有所帮助。

您可能想查看此答案中给出的 VBA(我自己没有尝试过)。

VBA QuickSort

然后,如果您需要在公式中执行此操作,您可以从此 VBA 创建一个用户定义函数来对单元格中的值进行排序。将arr = Split(ActiveCell.Text, ",") 行更改为"/",以便拆分您的列表。

接下来在原始数据旁边的列中使用您的公式,然后使用类似于此页面上的公式:Count occurrences of values or unique values in a data range 来计算唯一性。

如果您在上述任何方面需要更多帮助,请告诉我,我会在明天尝试。

【讨论】:

以上是关于无论它们的顺序如何,如何检查相同的值组合的主要内容,如果未能解决你的问题,请参考以下文章

检查两个数组的值是不是相等且顺序相同[关闭]

检查 PHP 中的真实数组标识?

c#如何检查SelectedListItem的两个列表是不是具有相同的值

如何检查特定的 json 键是不是具有与所有键相同的值

如何比较二进制文件以检查它们是不是相同?

你如何检查两个字符串在字符串中的任何点是不是处于相同的顺序? [关闭]