Konvertieren Sie ein Array in einen StringHallo alle,
Ich versuche, einen Wert aus einem Array aus einer anderen Tabelle abzurufen und ihn als Wert für meine Auswahl zu verwenden. Gibt es eine Möglichkeit, das Array in einen String umzuwandeln?
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
merged_file << select where(:Name_final==name_key);
Erweiterte statistische ModellierungMassenanpassungBetreff: Array in String konvertierenCraige,
Wieder einmal habe ich etwas Neues über JMP gelernt.Ich hatte den Code ursprünglich mit der Funktion „Contains()“ geschrieben, bin dann aber auf die Funktion „Loc()“ umgestiegen, weil ich dachte, dass es dort ein Problem geben würde
Contains( "BARBARA ANN", "BARBARA")
gibt ein True zurück.
Ich hatte (fälschlicherweise stellte sich heraus), dass, wenn die Vergleichskomponente der Enthält eine JMP-Liste von Elementen ist,
Contains( {"BARBARA ANN", "BETTY", "DAVID"}, "BARBARA")
würde ebenfalls „True“ zurückgeben, gibt jedoch „False“ zurück, was bedeutet, dass es eine absolute Übereinstimmung gibt.
Danke für die tollen Infos
Betreff: Array in String konvertierenWieder einmal erstaunt über Jims Fähigkeit, die Frage auf den Punkt zu bringen. Zwei nette Codeteile hier verdienen eine längere Erklärung:
Was bewirkt das?
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
ref_file_1 ist eine Datentabellenreferenz, "NAME" ist der Name einer Spalte als Zeichenfolge (wörtlich „NAME“, kann aber auch in einer Variablen enthalten sein) und der Spalte Die Funktion gibt einen Spaltenverweis zurück. Der < message ruft alle Werte aus der Spalte ab, einschließlich Duplikaten. Der assoziatives Array Die Funktion erstellt einen Satz eindeutiger Werte und die < Die Nachricht gibt die eindeutigen Werte zurück. (Schön gemacht @29755 .)
und das?
merged_file << select where(nrows(loc(name_key,:Name_final))>0);
Der < Die Nachricht wirkt auf jede Zeile des zusammengeführte_Datei , eine nach der anderen, und wählt Zeilen aus, wenn das Argument ungleich Null ist.
Der loc() Die Funktion gibt eine Indexmatrix zurück. Es durchsucht die Liste in name_key für Vorkommen von :Name_final. Die resultierende Matrix kann null oder mehr Zeilen haben, in diesem Beispiel wird sie jedoch 0 oder 1 Zeile haben, da die Schlüssel eindeutig sind. Der nrows() Die Funktion gibt 0 oder 1 zurück, die dann mit >0 verglichen wird und 0 oder 1 bleibt. Es werden also Zeilen ausgewählt, wenn :Name_final in der Liste von ref_file_1:NAME enthalten ist.
Alternative:
Was wäre, wenn es >1e6 Namen in name_key und >1e7 Zeilen in merge_file gäbe? Wie würde der Auftritt aussehen? Die Loc-Funktion wird viel suchen. Es werden 1e13-Strings verglichen. Sie werden es leid sein zu warten. Die Lösung hierfür besteht darin, das assoziative Array wie folgt zu verwenden:
nameSet = associative array(column(ref_file_1, "NAME") << get values);
merged_file << select where(contains(nameSet, :Name_final));
Jetzt gibt es nur noch 1e7-Suchen in nameSet. Sie sind nicht kostenlos, aber viel schneller als die sequentielle Prüfung von 1e6-Elementen. Ich schätze, es sind jeweils etwa 20 Vergleiche (log2(1e6)). Dies könnte auch für den nächsten Betreuer einfacher zu befolgen sein.
(Ungetestet. Korrekturen willkommen!)
Betreff: Array in String konvertierenIch denke, das wird Ihnen geben, was Sie wollen
name_key = associative array(column(ref_file_1, "NAME") << get values) << get keys;
merged_file << select where(nrows(loc(name_key,:Name_final))>0);