53 columnas de tiempo, algunas vacías y otras llenas. ¿Cómo escribo una fórmula para asegurarme de que la columna más llena sea mayor que la siguiente, etc.?Si tengo cientos de filas, cada fila es un ticket de trabajo separado, cada fila puede tener hasta 53 columnas de tiempo completas, pero la mayoría solo tiene algunas de estas columnas completas y las que están en el medio están en blanco.
Digamos entonces para la fila n.° 1: tengo la columna 1, la columna 23 y la columna 36 son las únicas columnas que contienen una marca de tiempo, necesitaré saber que 36>23 y 23>1.
Para la fila n.° 2, todas las columnas tienen marcas de tiempo, por lo que necesitaré saber que [53>52,............,2>1].
Gracias
Fiona
Modelado estadístico avanzadoInvestigación de mercado y consumoRe: 53 columnas de tiempo, algunas vacías y otras llenas. ¿Cómo escribo una fórmula que asegure que la columna llena más alta sea> que la siguiente columna llena, etc.Jarmo,
Esto funciona muy bien también.
No he hecho mucho con Matrices pero parece interesante. Tendré que revisarlo y asegurarme de que lo entiendo.
Gracias
Re: 53 columnas de tiempo, algunas vacías y otras llenas. ¿Cómo escribo una fórmula que asegure que la columna llena más alta sea> que la siguiente columna llena, etc.Aquí hay una posible solución usando Matrices.Si no se necesita información sobre el nombre de la columna, se puede acortar eliminando result_column y los cálculos relacionados.
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));Lo más probable es que también se use como fórmula, pero lo más probable es que no lo recomiende, ya que es bastante fácil de romper:
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 columnas de tiempo, algunas vacías y otras llenas. ¿Cómo escribo una fórmula que asegure que la columna llena más alta sea> que la siguiente columna llena, etc.Esto es genial, incluso mejor que lo que estaba preguntando porque me dice exactamente dónde la condición es falsa.
¡Gracias!
Re: 53 columnas de tiempo, algunas vacías y otras llenas. ¿Cómo escribo una fórmula que asegure que la columna llena más alta sea> que la siguiente columna llena, etc.No estoy exactamente seguro de que esto sea lo que desea, pero el siguiente script escanea las columnas y se asegura de que todos los valores de fecha aumenten desde la fecha anterior.Si no, coloca el nombre de la columna que ha detectado una fecha anterior a la fecha anterior.
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 columnas de tiempo, algunas vacías y otras llenas. ¿Cómo escribo una fórmula que asegure que la columna llena más alta sea> que la siguiente columna llena, etc.Solo para aclarar; Todos deberían ser correctos, por lo que creo que la forma más fácil es tener una columna de marcado que muestre un "1" al final de cualquier fila donde no sea el caso anterior.