1

私は、顧客が持つ可能性のあるさまざまな機器の組み合わせの長いリストを受け取りました。リストを作成した人が行ったことは、機器の製品番号を含むすべての列を連結しただけのようです。問題は、列の記入方法が実際の順序ではないことです。したがって、最初に機器 B を取得し、次に機器 A を取得した顧客の価値は B/A になり、別の顧客の価値も A/B になる可能性があります。私はExcelまたはSASのいずれかを使用して、順序に関係なくいくつの異なる組み合わせがあるかを把握しようとしています。この場合、A / B = b / Aであり、2つの組み合わせではなく1つだけになります。EXCEL または SAS を使用してこれを把握する方法はありますか? いつもお世話になっております、本当にありがとうございます!!

砂の

4

5 に答える 5

3

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;

必要に応じて、後でそれらを再結合することもできます。

于 2013-04-04T17:44:33.163 に答える
1

これは、VBA を使用せずに Excel ですべてのユニークな機器の組み合わせを提供する簡単な方法です。

組み合わせテキストの横に、各装備の列を挿入します (装備ごとに 1 列)。以下のドラフトを参照してください。機器の組み合わせにこの列の機器が含まれる場合、各列は 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,"#")

この形式については申し訳ありませんが、画像を投稿することは許可されていません:-(お役に立てば幸いです!

于 2013-05-17T05:21:40.217 に答える
0

これを Excel の数式としてまとめる時間がありました。私のソースへのリンクについては、この投稿の下部にある私の元のコメントを参照してください。

これを解決する手順:

セルをソートするユーザー定義関数

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://stackoverflow.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 では、元のデータ列と並んで 3 つの列を作成します。これらの式は、下のスクリーンショットの色付きの背景の列に表示されています。画像の下にそれぞれ説明があります。

Excel の数式

青の列: 上記の VBA 関数を使用して、元のリストの各セルの内容を並べ替えます。これにより、一意の項目をカウントできる一貫したリストが得られます。元のリストに小文字のインスタンスと大文字のインスタンスがあり、これらを同じものとして扱う必要がある場合は、この列の式を次のように変更します。=CellSort(UPPER(A2))

緑の列: 並べ替えられた各セルの最初のインスタンスを識別する単純なCOUNTIF関数 (最近のすべての Excel バージョンで機能します)。

赤いセル: 緑の列に TRUE が表示された回数をカウントします。これにより、一意のエントリの数が得られます。

そして以下が完成作品の一例です。

実際の式の例


元のコメント

今はこれをテストする時間がないのではないかと心配していますが、これが役立つかもしれません.

この回答に記載されている VBA を参照してください (私自身は試していません)。

VBAクイックソート

次に、数式でこれを行う必要がある場合は、この VBA からユーザー定義関数を作成して、セル内の値を並べ替えることができます。行arr = Split(ActiveCell.Text, ",")を have に変更して"/"、リストを分割します。

次に、元のデータと一緒に列で数式を使用してから、このページの数式のようなものを使用します:データ範囲内の値または一意の値の出現をカウントして、一意をカウントします。

上記のいずれかについてさらにサポートが必要な場合はお知らせください。明日対応させていただきます。

于 2013-04-04T17:11:00.800 に答える
0

A と B が列に表示される方法を変更するために Excel で使用できる VBA コードを作成してみてください。たとえば、B/A の場合、アルファベット順に並べて A/B に変更します。A/B の場合は、すでにアルファベット順になっているため、そのままにしておきます。これが完了したら、その列でシートを並べ替えます。次に、A/B のようなデータが表示され、次の行にも A/B が表示される可能性があります。次に、必要に応じて、VBA コードを追加して、そのタイプの列で行を結合し、そのデータを新しいシートに書き出すことができます。これにより、すべての顧客が所有する機器タイプの一意のセットすべての一意の数が得られます。A/B/C を所有し、A/B 部分を A/B のみを所有する他の顧客と組み合わせる可能性のある顧客の一意の数が必要な場合は、

于 2013-04-04T16:51:06.873 に答える