Ciao a tutti.
Ho questa domanda molto complicata da spiegare qui. Quindi, in pratica, questa è la tabella dati:

Dovrei creare una colonna chiamata "Total Coordinates Around You" usando lo script JSL, immaginando che ci siano 8 quadrati attorno alla particolare coordinata (escludendo fondamentalmente la sua stessa coordinata), come mostrato dall'immagine sotto, dove il piccolo cerchio blu rappresenta questa particolare coordinata. Pertanto, il massimo "Coordinate totali intorno a te" è 8. Ad esempio, come mostrato nella figura sopra, con il numero 9998887, la coordinata (-2,1) ha una "Coordinate totali intorno a te" di 3, che sono (-2,2), (-1,1) e (-1,0). Solo per una nota, l'asse orizzontale rappresenta lo spostamento nella coordinata x e allo stesso modo, l'asse verticale rappresenta lo spostamento nella coordinata x. Dalla tabella di dati sopra, è facile creare 20 "Coordinate totali intorno a te", ma nelle mie attività effettive ci sono circa 23.000 righe da trattare. Inoltre, una cosa in più, dovrei ordinare i numeri in base, come 9465371 e 9998887 mostrati nella tabella di dati sopra, rispettivamente (hanno le stesse coordinate), prima di lavorare sulla "Coordinate totali intorno a te".

dt = current data table();
dt << New column ("Total Coordinates Around You",
numeric,
continuous,
formula (
For ( i = 1, i<= N Row(), i++,
(:Total Coordinates Around You = 0; munipulated_x = :X-Coordinate - 1; munipulated_y = Y-Coordinate - 1; j = 1; k = 1; formula (
For ( j = 1, j <= 3, j++,
(formula(
For ( k = 1, k <= 3, k++,
(formula( If (munipulated_x == :X-Coordinate & munipulated_y == :Y-Coordinate, :Total Coordinates Around You))
; munipulated_y ++)
)
) ; munipulated_x ++)
)
) ; :Total Coordinates Around You --)
)
)
);Sopra è una sceneggiatura che ho creato, che non sono sicuro del perché non possa funzionare, usando i loop. Qualcuno può illuminarmi sui passi e le soluzioni su come affrontare questo problema? C'è una seconda parte a questa domanda, che proverò una volta che avrò finito la mia prima parte. Permettetemi di spiegare se vi fosse qualche dubbio, in particolare sulla chiarezza della domanda e della spiegazione, e ancora una volta, scusatemi per la spiegazione. Grazie.
Non lo farei in una formula perché viene eseguito per ogni riga, quindi il loop all'interno di una formula ti farà essere piuttosto lento.
Questo probabilmente non è il modo migliore ma sembra funzionare. Supponendo che capisco correttamente e stai cercando di trovare quante tessere tocchino la tua tessera iniziale?
Fammi sapere se questo è quello che stai cercando di fare.
Names default to here(1);
dt = New Table( "Example",
Add Rows( 20 ),
New Column( "Number",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[9465371, 9465371, 9465371, 9465371, 9465371, 9465371, 9465371, 9465371,
9465371, 9465371, 9998887, 9998887, 9998887, 9998887, 9998887, 9998887,
9998887, 9998887, 9998887, 9998887]
)
),
New Column( "X-Coordinate",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[2, 2, 1, 1, 0, 0, -1, -1, -2, -2, 2, 2, 1, 1, 0, 0, -1, -1, -2, -2]
)
),
New Column( "Y-Coordinate",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Selected,
Set Values( [2, 1, 0, -1, 3, 2, 1, 0, 2, 1, 2, 1, 0, -1, 3, 2, 1, 0, 2, 1] )
),
New Column("Adjacent", Numeric, "Continuous")
);
summarize(dt, byn = By(:Number));
for(i=1, i<=nitems(byn), i++,
sel = byn[i];
rows = dt << Get Rows Where(:Number == num(sel));
mat = dt[rows, {"X-Coordinate", "Y-Coordinate"}];
for(k = 1, k<=nrows(rows), k++,
row = rows[k];
// do a check that you're within the limit
adj = sqrt( (mat[k, 1] - mat[0, 1])^2 + (mat[k, 2] - mat[0, 2])^2) <= sqrt(2);
Column(dt, "Adjacent")[row] = nrows(Loc(adj)) - 1;
)
);Non sono sicuro di aver compreso il requisito, ma se vuoi trovare punti vicini a un determinato punto, potresti anche considerare l'uso di 'KDTable ()'. Per esempio:
Names Default To Here( 1 );
n = 100; // Size of square
// Make a table of x and y locations
dtx = AsTable((1::n)`, << Invisible);
dty = AsTable((1::n)`, << Invisible);
dt = dty << Join( With( dtx ), Cartesian Join );
Close(dtx, NoSave);
Close(dty, NoSave);
Column(dt, 1) << setName("x");
Column(dt, 2) << setName("y");
dt << deleteProperty("Source");
dt << setName("xy Locations");
// Put thes locations into a matrix
mat = dt << getAsMatrix;
tbl = KDTable( mat );
// Pick a point in the interior, so we don't need to decide on any boundary conditions
myX = RandomInteger(2, n-1);
myY = RandomInteger(2, n-1);
myRow = Loc(mat[0, 1] == myX & mat[0, 2] == myY);
myRow = myRow[1];
// Find the 8 nearest neighbours to the chosen point
{rows, dist} = tbl << K nearest rows( 8, myRow );
Show( myRow, rows );
// Check it worked
myXvals = Column(dt, "x")[myRow];
myYvals = Column(dt, "y")[myRow];
dt << NewColumn("Distance", Numeric, Continuous, Formula(sqrt((:x - myXvals)^2 +(:y - myYvals)^2)));
dt << selectRows(VConcat(myRow, rows`));
gb = dt << Graph Builder(
Size( 529, 453 ),
Show Control Panel( 0 ),
Variables( X( :x ), Y( :y ), Color( :Distance ) ),
Elements( Points( X, Y, Legend( 5 ) ) )
);