无论它们的顺序如何,如何检查相同的值组合
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 来计算唯一性。
如果您在上述任何方面需要更多帮助,请告诉我,我会在明天尝试。
【讨论】:
以上是关于无论它们的顺序如何,如何检查相同的值组合的主要内容,如果未能解决你的问题,请参考以下文章