Zusammenfassung der kategorialen EbenenIch möchte eine Zusammenfassung der Werte einer Spalte erhalten und eine andere als „Nach“-Gruppe verwenden.Es ist wie das, was Summary() mit N Kategorien macht, aber ich möchte eine Liste der tatsächlichen Werte, nicht nur deren Anzahl.Nehmen Sie zum Beispiel diese Tabelle:

Ich möchte so etwas wie:

Ich denke, ich könnte etwas damit anfangen, die „Kategorie“ als Untergruppe in Summary() zu verwenden und dann Columns() neu zu kodieren und zu kombinieren?Irgendwelche besseren oder clevereren Ideen?Ich habe mich ein wenig in der Community umgesehen und konnte (überraschenderweise?) nichts Analoges finden. Vielleicht einen Ort für die Verwendung assoziativer Arrays?Diese Beispieltabelle ist winzig, die Tabelle, auf der ich sie ausführen werde, könnte ein paar Millionen Zeilen mit Hunderten von „Ebenen“ für die Gruppenspalte umfassen.
Betreff: Zusammenfassung der kategorialen EbenenEs wäre angebracht, wenn Sie alle Antworten, die Ihnen eine richtige Antwort geliefert haben, als Lösung markieren, damit zukünftige Leser die verschiedenen Möglichkeiten zur Lösung des Problems sehen können.Betreff: Zusammenfassung der kategorialen EbenenVielen Dank an beide für die Lösungen – am Ende habe ich etwas mit einem assoziativen Array gemacht.Ich werde das hier veröffentlichen, in der Hoffnung, dass einer dieser drei Ansätze für die nächste Person funktioniert, die dies versucht:
Names Default To Here( 1 );
// Create the beginning table
dt = New Table( "Example",
Add Rows( 11 ),
New Column( "Group",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [1, 1, 2, 3, 4, 5, 5, 5, 6, 7, 8] )
),
New Column( "Category",
Character,
"Nominal",
Set Values( {"A", "A", "B", "A", "D", "X", "Y", "Z", "A", "B", "C"} )
)
);
// let Summary do N Categories() for us
dt_sum = dt << Summary( Group( :Group ), N Categories( Category ) );
// the name of the column for which we want a list of the categories
category_col = "Category";
sum_colname = "Value List("|| category_col || ")";
// new col in the summary table to hold the list of values
dt_sum << New Column(sum_colname, Character);
// dump the group col into a matrix for quicker access
sum_groupdat = dt_sum:Group << Get As Matrix();
main_groupdat = dt:Group << Get As Matrix();
For( ri = 1, ri <= N Rows( dt_sum ), ri++,
// rows in main table that match the 'group by' col
inds = Loc( main_groupdat, sum_groupdat[ri] );
tmpaa = Associative Array( Column( dt, category_col )[inds] );
keys = tmpaa << Get Keys();
// if the category_col is numeric, need to convert the numbers to chars!
If( Is Number( keys[1] ),
charkeys = {};
For( ki = 1, ki <= N Items( keys ), ki++,
charkeys[ki] = Char( keys[ki] );
);
,
charkeys = keys
);<BR /> // stuff all the items together and dump it into this row
valstr = Concat Items( charkeys, "," );
Column( dt_sum, sum_colname )[ri] = valstr;
);
Betreff: Zusammenfassung der kategorialen EbenenIch sehe jetzt, dass Jim bereits eine Lösung vorgestellt hat.
Hier ist ein anderer Ansatz mit Tabellarisierung und Kombination von Spalten (Spalte mit mehreren Antworten), der hoffentlich auch für den gesamten Datensatz funktioniert.
// Groups is the example table with 2 nominal columns
DT_GroupCategory = Data Table( "Groups" );
// creates a cross table
Tab_DT_GroupCategory = DT_GroupCategory << Tabulate(
Add Table(
Column Table( Grouping Columns( :Category ) ),
Row Table( Grouping Columns( :Group ) )
)
);
// make data table from it
DT_GroupCategory_CrossTab = Tab_DT_GroupCategory << Make Into Data Table;
DT_GroupCategory_CrossTab << Add Multiple Columns( "N Categories", 1, after( 1 ), Numeric );
Names_DT_GroupCategory_CrossTab = DT_GroupCategory_CrossTab << Get Column Names;
// replace 0 by missing and everything else by column name (probably not the most efficient way to do this)
For( i=3, i<=N Items( Names_DT_GroupCategory_CrossTab ), i++,
Column( DT_GroupCategory_CrossTab, i ) << Data Type( "Character" );
For( j=1, j<=N Rows( DT_GroupCategory_CrossTab ), j++,
If( Column( DT_GroupCategory_CrossTab, i )[j] == "0",
Column( DT_GroupCategory_CrossTab, i )[j] = "",
Column( DT_GroupCategory_CrossTab, i )[j] = Char( Names_DT_GroupCategory_CrossTab[i] );
)
)
);
// make multiple response column with Cols -> Utilities -> Combine Columns
DT_GroupCategory_CrossTab << Combine Columns(
delimiter( "," ),
Columns( 2::N Items( Names_DT_GroupCategory_CrossTab ) ),
Selected Columns are Indicator Columns( 0 ),
Column Name( "Values(Category)" )
);
// add formula to get N Categories. +1 is added for one less comma, then div by 2 to get number of categories
Column( DT_GroupCategory_CrossTab, "N Categories" ) << Formula( (Length( :Name( "Values(Category)" ) ) + 1) / 2 );
Tab_DT_GroupCategory << Close Window;

Betreff: Zusammenfassung der kategorialen EbenenIch denke, der Anfang besteht darin, die Datentabelle aufzuteilen und dann von dort aus zu arbeiten.Nachfolgend finden Sie ein einfaches Skript, das ich geschrieben habe, um Ihnen die gewünschten Ergebnisse zu liefern.Wenn Sie dies interaktiv tun möchten, befolgen Sie einfach die Schritte im Skript
Names Default To Here( 1 );
// Create the beginning table
dt = New Table( "Example",
Add Rows( 11 ),
New Column( "Group",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [1, 1, 2, 3, 4, 5, 5, 5, 6, 7, 8] )
),
New Column( "Category",
Character,
"Nominal",
Set Values( {"A", "A", "B", "A", "D", "X", "Y", "Z", "A", "B", "C"} )
)
);
// Change the group column to character so
// split columns are blanks and not missing values
dt:Group << data type( character );
// Split the columns
dtSplit = dt << Split( Split By( :Category ), Split( :Group ), Group( :Group ), Sort by Column Property );
// Change the data type back
dt:Group << data type( numeric );
dtSplit:Group << data type( numeric );
// Convert all of the non blank entries to the value of the column name
For( i = 2, i <= N Cols( dtSplit ), i++,
theRows = dtSplit << get rows where( As Column( dtsplit, i ) != "" );
If( N Rows( theRows ) > 0,
Column( dtSplit, i )[theRows] = Column( dtsplit, i ) << get name
);
);
// get all of the character column names
namesList = dtSplit << get column names( character, string );
// Create the combined column
dtSplit << Combine Columns(
delimiter( "," ),
Columns( :a, :b, :c, :d, :X, :y, :z ),
Column Name( "Values (Category)" )
);
// Count the number of combined values
dtSplit << New Column( "N Categories (Category)",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
count = 1;
While( Word( count, :Name( "Values (Category)" ), "," ) != "", count++ );
count = count - 1;
)
);
// get rid of the formula
dtSplit:Name("N Categories (Category)") << delete property(formula);
// delete the unnecessary columns
dtSplit << delete columns( namesList );