Hola,
Encontré una discusión de 2015 (asunto "sumif") que tiene un guión muy útil para mi tarea actual. Escribí allí mi pregunta, pero no sé si las personas que participaron en esa discusión pueden ver mi pregunta.
Encontré este script (ligeramente modificado) y funciona muy bien para contar columnas para cada fila donde los valores son "0/0" (o lo que sea).
dt << New Column("Sum",
Numeric, Formula(
Local({i = 0, n = N Col(Current Data Table()) - 1},
Sum(Repeat({i++ ; (Column(i)[] =="0/0")}, n))
)
)
);Sin embargo, ¿cómo editar este script para contar columnas que contienen "algún_carácter"?
Adjunté una tabla de datos donde la última columna "Suma" tiene una fórmula y los números resultantes necesarios.
Tengo una tabla de big data y me gustaría tener un script para contar columnas para cada fila con valores específicos (como carácter).
Intenté modificar el script anterior pero no funciona:
dt << New Column("Miss",
Numeric, Formula(
Local({i = 0, n = N Col(Current Data Table()) - 1},
Sum(Repeat({i++ ; (Contains(Column(i)[],"."))}, n))
)
)
);</CODE>Please, help</P><P>Valentina</P></LINGO-BODY><LINGO-LABS id="lingo-labs-737490" slang="en-US" mode="CREATE"><LINGO-LABEL>Automatización y secuencias de comandos</LINGO-LABEL></LINGO-LABS><LINGO-SUB id="lingo-sub-737514" slang="en-US" mode="CREATE">Re: sumif: contar columnas si contienen algún carácter</LINGO-SUB><LINGO-BODY id="lingo-body-737514" slang="en-US" mode="CREATE"><P>¿Necesita tener una fórmula para esto?</P></LINGO-BODY><LINGO-SUB id="lingo-sub-737576" slang="en-US" mode="CREATE">Re: sumif: contar columnas si contienen algún carácter</LINGO-SUB><LINGO-BODY id="lingo-body-737576" slang="en-US" mode="CREATE"><P>Lo siento, no entiendo tu pregunta.</P><P>Tengo una tabla de ~500.000 filas y ~3.000 columnas. Necesito calcular la suma entre columnas que contienen un punto; no puedo usar la fórmula. .</P><P>Quiero tener un guión, cualquier guión que funcione. Probé diferentes enfoques pero ninguno funcionó. .</P></LINGO-BODY><LINGO-SUB id="lingo-sub-737577" slang="en-US" mode="CREATE">Re: sumif: contar columnas si contienen algún carácter</LINGO-SUB><LINGO-BODY id="lingo-body-737577" slang="en-US" mode="CREATE"><P>Esto es de mi registro:</P><P> </P><P>Fórmula de suma de columnas interrumpida<BR /> El argumento es un tipo incorrecto en la fila 421001 en el acceso o evaluación de 'Contiene', Argumento incorrecto (Columna (i) []), Contiene/*###*/(Columna (i) [], ".")<BR /> Se han ignorado los errores de evaluación de fórmulas.</P></LINGO-BODY><LINGO-SUB id="lingo-sub-737582" slang="en-US" mode="CREATE">Re: sumif: contar columnas si contienen algún carácter</LINGO-SUB><LINGO-BODY id="lingo-body-737582" slang="en-US" mode="CREATE"><P>Lo más probable es que su bucle llegue a alguna columna que no sea una columna de caracteres. Esta parte probablemente necesite alguna modificación.</P>
<PRE><CODE class=" language-jsl">n = N Col(Current Data Table()) - 1
Es muy difícil saber cómo se debe hacer sin conocer sus datos. Podría ser simplemente una simple modificación del -1, obtener una lista de columnas de caracteres o calcular qué columnas recorrer mediante algún tipo de patrón.
He adjuntado una pequeña tabla de datos a mi publicación. Tiene 3 filas y 3 columnas con encabezado:
T1 T2 T3
0/0./. 0/0
./. ./. ./.
0/0 0/0 0/0
El script no funciona en esta tabla de muestra.
Fórmula de suma de columnas interrumpida
El argumento es un tipo incorrecto en la fila 1 en el acceso o evaluación de 'Contiene', Argumento incorrecto (Columna (i) []), Contiene/*###*/(Columna (i) [], ".")
Se han ignorado los errores de evaluación de fórmulas.
La tabla de datos original que adjuntó no era así ya que tiene 4 columnas (no puede ignorar la columna Suma)

Dependiendo de sus datos, así es como lo haría si tuviera que usar una Fórmula (lo más probable es que lo evitaría y simplemente usaría una solución de script pura)
Names Default To Here(1);
dt = Open("$DOWNLOADS/sum_help_data.jmp");
dt << Delete Column("Sum");
dt << New Column("Miss", Numeric, Continuous, Formula(
As Constant(
cols_of_interest = Filter Each({colname}, Current Data Table() << Get Column Names("String"),
!IsMissing(Regex(colname, "S\d"));
);
);
Local({
res = 0;
},
For Each({colname}, cols_of_interest,
res = res + (Contains(Column(colname)[], ".") > 0);
);
res;
);
));
Sí, parece que todos los datos deberían ser del mismo tipo.
Gracias, ¡funciona!