53 colonne di tempo, alcune vuote e alcune riempite. Come faccio a scrivere una formula che assicuri che la colonna più riempita sia > della successiva colonna riempita ecc.Se ho centinaia di righe, ogni riga è un ticket di lavoro separato, ogni riga può avere fino a 53 colonne orarie compilate, ma la maggior parte ha solo alcune di queste colonne compilate e quelle intermedie sono vuote.
Supponiamo per la riga n. 1: ho la colonna 1, la colonna 23 e la colonna 36 come uniche colonne contenenti un timestamp, quindi avrò bisogno di sapere che 36>23 e 23>1.
Per la riga n. 2 tutte le colonne hanno timestamp, quindi avrò bisogno di sapere che [53>52,............,2>1].
Grazie
Fiona
Modellazione statistica avanzataRicerca sui consumatori e sul mercatoRe: 53 Colonne del tempo, alcune vuote e altre piene. Come scrivo una formula assicurandomi che la colonna riempita più alta sia > della colonna riempita successiva ecc.Jarmo,
Anche questo funziona molto bene.
Non ho fatto molto con Matrices ma sembra interessante. Dovrò esaminarlo e assicurarmi di averlo capito.
Grazie
Re: 53 Colonne del tempo, alcune vuote e altre piene. Come scrivo una formula assicurandomi che la colonna riempita più alta sia > della colonna riempita successiva ecc.Ecco una possibile soluzione utilizzando Matrici.Se non sono necessarie informazioni sul nome della colonna, è possibile accorciarlo rimuovendo result_column e i calcoli ad esso correlati.
Names Default To Here(1);
dt = Current Data Table();
result_flag = [];
result_column = {};
For Each Row(dt,
m_all = dt[Row(), 0]; //get all values of row to matrix
m_values = m_all[Loc(m_all)]; //remove missing values;
start = Insert(m_values[1::N Items(m_values)-1], 0, 1); //shift right by 0 and remove last value
end = m_values;
//if we only want to know if any value is smaller than previous, we can just us any
Insert Into(result_flag, Any(end - start < 0)); //we could stop here if we don't want to know the column name
//but that doesn't tell us which column(s) breaks the "rule"
idx = Loc(end - start < 0); //indices of value matrix which break the rule -> will require checking for empty
If(N Items(idx) == 0,
Insert Into(result_column, "");
, //else
breaking_col = Min(Loc(m_all, m_values[Min(idx)])); //values which break rule, we can most likely just get the first index?
Insert Into(result_column, Column(dt, breaking_col) << get name);
);
);
dt << New Column("Flag", Numeric, Nominal, Values(result_flag));
dt << New Column("Column_Flag", Character, Nominal, Values(result_column));Molto probabilmente potrebbe anche essere usato come formula, ma molto probabilmente non lo consiglierei in quanto è abbastanza facile da rompere:
dt << New Column("Formula_Flag", Numeric, Nominal, Formula(
dt = Current Data Table();
m_all = Matrix(dt[Row(), 0]);
m_values = m_all[Loc(m_all)];
start = Insert(m_values[Index(1, N Items(m_values) - 1)], 0, 1);
end = m_values;
Any(end - start < 0);
));
Re: 53 Colonne del tempo, alcune vuote e altre piene. Come scrivo una formula assicurandomi che la colonna riempita più alta sia > della colonna riempita successiva ecc.Questo è fantastico, anche meglio di quello che stavo chiedendo perché mi dice esattamente dove la condizione non è vera.
Grazie!
Re: 53 Colonne del tempo, alcune vuote e altre piene. Come scrivo una formula assicurandomi che la colonna riempita più alta sia > della colonna riempita successiva ecc.Non sono esattamente sicuro che questo sia ciò che desideri, ma lo script seguente esegue la scansione delle colonne e si assicura che tutti i valori di data aumentino rispetto alla data precedente.In caso contrario, inserisce il nome della colonna che ha rilevato una data precedente rispetto alla data precedente.
Names Default To Here( 1 );
dt = Current Data Table();
If( Try( dt:flag << get name, "" ) == "",
dt << New Column( "Flag", Character )
);
For( rowNum = 1, rowNum <= N Rows( dt ), rowNum++,
For( startCol = 1, startCol <= N Cols( dt ), startCol++,
If( Is Missing( Column( startCol )[rowNum] ) == 0,
holdVal = Column( startCol )[rowNum];
Break();
)
);
For( col = startCol + 1, col <= N Cols( dt ) - 1, col++,
If( Is Missing( Column( Col )[rowNum] ) == 0,
If( Column( Col )[rowNum] < holdVal,
dt:Flag[rowNum] = (Column( Col )) << get name;
holdVal = Column( col )[rowNum];
Break();
,
holdVal = Column( Col )[rowNum]
)
)
);
);Re: 53 Colonne del tempo, alcune vuote e altre piene. Come scrivo una formula assicurandomi che la colonna riempita più alta sia > della colonna riempita successiva ecc.Giusto per chiarire; Dovrebbero essere tutti corretti, quindi penso che il modo più semplice sia avere una colonna contrassegnata che visualizzerà un "1" alla fine di qualsiasi riga dove sopra non è il caso.