JSL: cómo recorrer columnas, generar un informe de Graph Builder y guardar cada una como un archivo JPGEstoy tratando de crear un script que pueda recorrer cada celda de cada columna para contar la cantidad de celdas que son menores o mayores que un valor específico.
Si tengo una tabla de columnas A ~ D y filas 1 ~ 10, me gustaría contar los valores de las celdas por filas y por columnas. En otras palabras, para todas las filas de la columna A, ¿cuántas cumplen mis criterios? Y de manera similar para todas las columnas de la Fila 1, cuántas cumplen con mis criterios. Entonces haría esto para todas las filas y columnas.
Esto es lo que he intentado para empezar, pero no devuelve nada. ¿Alguna idea sobre esto o una forma más eficiente de hacerlo?
Names Default To Here( 1 );
dt = Current Data Table();
Clear Log();
// Get all of the numeric columns in the data table
Numeric Columns = dt << get column names( numeric, string );
NRows = N Rows( dt );
Count = {};
//Column loop
For( i = 1, N Items( Numeric Columns ) <= 1, i++,
For Each Row(
dt,
If( Column(dt, Numeric Columns[i]) < 101,
Count = Count++;
Show( Count );
)
)
);
Re: JSL: cómo recorrer columnas, generar un informe de Graph Builder y guardar cada una como un archivo JPGTambién puede reemplazar la sección "Para cada fila" con una línea para contar el número de filas de cada columna.Esto utilizaría las funciones de la tabla de datos en lugar de tener que revisar cada fila de cada columna.
COUNT_VAL=NROWS((DT<<SELECT where=""></SELECT>
Re: JSL: cómo recorrer columnas, generar un informe de Graph Builder y guardar cada una como un archivo JPGHay algunos problemas con el script que se solucionan fácilmente.
1. La porción de prueba del ciclo for es incorrecta:
<SPAN class="token function">N Items</SPAN><SPAN class="token punctuation">(</SPAN> Numeric Columns <SPAN class="token punctuation">)</SPAN> <SPAN class="token operator"><=</SPAN> <SPAN class="token number">1</SPAN>
El número de columnas numéricas no cambia. Si hay 0 o 1 columnas numéricas, el bucle se ejecutará para siempre porque 0<=1 y 1<=1. Si hay al menos 2 columnas numéricas, entonces el bucle no se ejecuta en absoluto porque 2 (o más) <= 1 siempre es falso. La prueba debe ser esta:
i <= N Items( Numeric Columns )
Eso prueba si su iterador (i) es mayor que el número de columnas y se detiene cuando lo es.
2. En un bucle For Each Row, aún necesita subíndice en la fila, simplemente no tiene que administrar la iteración usted mismo. Entonces esta pieza:
<SPAN class="token function">Column</SPAN><SPAN class="token punctuation">(</SPAN>dt<SPAN class="token punctuation">,</SPAN> Numeric Columns<SPAN class="token punctuation">[</SPAN>i<SPAN class="token punctuation">]</SPAN><SPAN class="token punctuation">)</SPAN> <SPAN class="token operator"><</SPAN> <SPAN class="token number">101</SPAN>
Debería verse así:
<SPAN class="token function">Column</SPAN><SPAN class="token punctuation">(</SPAN>dt<SPAN class="token punctuation">,</SPAN> Numeric Columns<SPAN class="token punctuation">[</SPAN>i<SPAN class="token punctuation">]</SPAN><SPAN class="token punctuation">)[Row()]</SPAN> <SPAN class="token operator"><</SPAN> <SPAN class="token number">101</SPAN>
3. Su variable Count es una lista, pero la está tratando como un número. Count++ no le hace nada a una lista que no está llena de números. Establezca Count = 0 en lugar de Count = {}. Además, Count++ devuelve el valor actual y luego establece Count en Count +1. Entonces Count = Count++ nunca cambiará el valor de Count. (Ejemplo: Cuenta = 0. Contar = Contar++. Count sigue siendo igual a cero.)
Aquí está el guión completo con los cambios anteriores. El Conteo final es el número de celdas en todas las columnas numéricas que son menos de 101.
Names Default To Here( 1 );
dt = Current Data Table();
Clear Log();
// Get all of the numeric columns in the data table
Numeric Columns = dt << get column names( numeric, string );
NRows = N Rows( dt );
Count = 0;
//Column loop
For( i = 1, i <= N Items( Numeric Columns ), i++,
For Each Row(
dt,
If( Column(dt, Numeric Columns[i])[Row()] < 101,
Count++;
Show( Count );
)
)
);
HH,
melanie
Re: JSL: cómo recorrer columnas, generar un informe de Graph Builder y guardar cada una como un archivo JPG@abdulj ,
Puede usar matrices para identificar las condiciones con las que desea realizar la prueba. Aquí hay un ejemplo,
Clear Log();
// Open a sample data set
dt = Open( "$SAMPLE_DATA/Cars.jmp" );
// Extracting numeric column names
ColNames = dt << Get Column Names("String");
NumericCols = [];
for(nCol = 1, nCol <= N Items(ColNames), nCol++,
DType = Column(dt,nCol) << Get Data Type;
If(DType == "Numeric",
NumericCols = NumericCols || nCol;
);
);
NumericColNames = ColNames[NumericCols];
// Extract numeric data only
Mat = dt << Get As Matrix;
// Row Wise Test
// For e.g. Find all rows where year < 90
YearCondition = Loc(Mat[0,1] < 90);
Show(Mat[YearCondition,0]);