Ich versuche, eine Spaltenfunktion zu entwickeln, die jede Zeile meiner Datentabelle zählt.
1) Die :X- und :Y-Koordinaten sind weniger als 2 euklidische Distanz voneinander entfernt
&
2) Der Wert ist = 5
In diesem 5 mal 5 Raster ist jeder :Value auf 1 gesetzt, außer beim zentralen Datenpunkt (3,3), der den Wert :Value = 5 hat.
Die blau markierten Datenpunkte liegen maximal 2 Einheiten vom zentralen Datenpunkt entfernt und werden daher in ihrem Bereich korrekt als 1 Datenpunkt gezählt.
Die rot markierten Datenpunkte haben keine Zeilen mit :Value = 5 im Bereich und zählen daher einen Wert von Null.

Ich habe verschiedene Methoden ausprobiert, um das zu lösen. Hauptsächlich habe ich die Funktion `For Each Row()` verwendet, aber die scheint in einer Spaltenfunktion nicht richtig zu funktionieren. Wahrscheinlich mache ich etwas falsch. Hat jemand eine Idee?
Wenn Sie eine Formel benötigen, kann es etwas dauern, aber die Verwendung von „Als Konstante“ kann helfen. Sie könnten sich Distance(), KDTable() und eventuell VPTree() ansehen.
Dies sind keine optimierten Beispiele, sondern einfache Beispiele für die Verwendung von As Constant() und KDTable/Distance.
Current Data Table() << New Column("R", Numeric, Ordinal, Formula(
As Constant(
tree = KDTable(Current Data Table()[0, {"X", "Y"}]);
{rows, dist} = tree << K nearest rows(25, 13);
v = rows[Loc(dist <= 2)];
);
If(Contains(v, Row()),
1,
0
);
));
Ein Beispiel anhand der Entfernung
Current Data Table() << New Column("R", Numeric, Ordinal, Formula(
As Constant(
five_idx = Where(:Value == 5);
m = :X[five_idx] || :Y[five_idx];
);
Sqrt(Distance(Matrix({:X, :Y})`, m)) <= 2;
));
Wenn Sie keine Formel benötigen, können diese effizienter hergestellt werden.