Sto lavorando con un set di dati in cui devo trovare la media di due righe e sostituire le due righe in media.
il seguente è il set di dati in cui voglio trovare il valore medio per ogni giorno per una determinata settimana e sensore. Una volta capito, posso usare le funzioni di trasposizione/impila per ottenere l'output desiderato. Qualsiasi aiuto è apprezzato.
| Sensore | Settimana | DoW | Valore |
| UN | 1 | | 0,25 |
| UN | 2 | | 0,33 |
| UN | 3 | | 0,76 |
| UN | 4 | Sole(D) | 0,21 |
| UN | | Sole(N) | 0,75 |
| UN | | Lun(G) | 0,33 |
| UN | | Lun(N) | 0,34 |
| B | 1 | | 0.6 |
| B | 2 | | 0,82 |
| B | 3 | | 0,55 |
| B | 4 | Sole(D) | 0.4 |
| B | | Sole(N) | 0,22 |
| B | | Lun(G) | 0,91 |
| B | | Lun(N) | 0,98 |
| C | 1 | | 0,25 |
| C | 2 | | 0,35 |
| C | 3 | | 0,76 |
| C | 4 | Sole(D) | 0,21 |
| C | | Sole(N) | 0,75 |
| C | | Lun(G) | 0,33 |
| C | | Lun(N) | 0,34 |
L'output atteso è -
| Sensore | Settimana 1 | Settimana2 | Settimana 3 | Settimana4.Dom | Settimana4.Lun |
| UN | 0,25 | 0,33 | 0,76 | 0,48 | 0,34 |
| B | 0.6 | 0,82 | 0,55 | 0.31 | 0,95 |
| C | 0,25 | 0,35 | 0,76 | 0,48 | 0,34 |
Vedi se questo pezzo di JSL ti darà quello che vuoi, o almeno un punto di partenza.Ho dovuto fare un paio di ipotesi sui dati, ma potrebbe funzionare per te
Names Default To Here( 1 );
dt = New Table( "Example",
Add Rows( 21 ),
New Script(
"Source",
Data Table( "Untitled 29" ) << Transpose(
columns( :Column 1 ),
By( :Column 2 ),
Output Table( "Transpose of Untitled 29" )
)
),
New Column( "Sensor",
Character,
"Nominal",
Set Values(
{"A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "B",
"C", "C", "C", "C", "C", "C", "C"}
)
),
New Column( "Week",
Numeric,
"Ordinal",
Format( "Best", 12 ),
Set Values(
[1, 2, 3, 4, ., ., ., 1, 2, 3, 4, ., ., ., 1, 2, 3, 4, ., ., .]
)
),
New Column( "DoW",
Character,
"Nominal",
Set Values(
{"", "", "", "Sun(D)", "Sun(N)", "Mon(D)", "Mon(N)", "", "", "",
"Sun(D)", "Sun(N)", "Mon(D)", "Mon(N)", "", "", "", "Sun(D)", "Sun(N)",
"Mon(D)", "Mon(N)"}
)
),
New Column( "Value",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[0.25, 0.33, 0.76, 0.21, 0.75, 0.33, 0.34, 0.6, 0.82, 0.55, 0.4, 0.22,
0.91, 0.98, 0.25, 0.35, 0.76, 0.21, 0.75, 0.33, 0.34]
)
)
);
wait(5); // wait so you can see the original data table
dt << New Column( "The Date",
Character,
"Nominal",
Formula(
dowInclude = "";
If( Is Missing( :Week ) == 0,
theInclude = Char( :Week )
);
If( :DoW != "",
dowInclude = Word( 1, :DoW, "(" )
);
Trim( "Week" || theInclude || " " || dowInclude );
),
Set Selected,
Set Display Width( 83 )
);
wait(5); // wait so you can see the new formula generated column
// Create the means
dtSum = dt << Summary(
invisible,
Group( :Sensor, :The Date ),
Mean( :Value ),
Freq( "None" ),
Weight( "None" ),
statistics column name format( "column" ),
Link to original data table( 0 )
);
// Split the table into the Final Display Format
dtFinal = dtSum << Split(
Split By( :The Date ),
Split( :Value ),
Group( :Sensor ),
Remaining Columns( Drop All ),
Sort by Column Property
);
// Clean up
close( dtSum, nosave );Grazie per la tua risposta. Ho già provato questo approccio. Ma il problema è che i nomi delle colonne sono nel formato Valore, settimana, giorno e rinominarli è complicato perché i nomi delle colonne cambiano con la modifica della settimana e del giorno.
C'è qualche altra opzione che posso provare/leggere?
Utilizzeresti la piattaforma della tabella di riepilogo per farlo con due variabili di sottogruppo.
Per prima cosa dovresti eliminare i caratteri extra dai valori DoW e quindi eseguire il Riepilogo, ad esempio:
New Column( "Day", Character, "Nominal", Formula( Substr( :DoW, 1, 3 )));
Summary(
Group( :Sensor ),
Mean( :Value ),
Subgroup( :Week, :Day ),
Freq( "None" ),
Weight( "None" )
);