<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />hola amigos, tengo una pregunta sobre cómo puedo combinar una cantidad de columnas creadas en mi tabla, en una nueva columna que describe si alguna de estas columnas tiene un valor de carácter específico ("filtrado").
Actualmente, mis conjuntos de datos se analizan con una secuencia de comandos que agrega "n" nuevas columnas que contienen los valores de caracteres "apantallados" y "no apantallados" según las fórmulas de la secuencia de comandos.
Mi objetivo es incluir en el script un paso final que agregue una nueva columna que evalúe el valor en cada una de las 'n' nuevas columnas y si para cada fila, cualquiera de esas columnas está 'filtrada', entonces etiqueta esa fila como filtrada .
Si el número de columnas nuevas fuera siempre el mismo, simplemente escribiría una declaración If larga, verificando el valor en cada columna. Sin embargo, necesito escribirlo para ver 'n' número de columnas. Pensé en usar un bucle FOR dentro de una fórmula, por ejemplo, algo como:
dt << Nueva Columna("Todas_las_pantallas",carácter,nominal,setformula(
If( For( i = 1, i <= N Elementos( columnas de pantalla individuales ), columnas de pantalla individuales == "Apantallado"), ---> necesita algo de magia, de modo que si alguna de las columnas de pantalla contiene pantalla, entonces ---> "Apantallado", "No apantallado" ) );
Pero como los bucles FOR no devuelven ningún valor, no pude descifrar esta magia. Alguien tiene alguna opinión?
Gracias,
--Durazno
La implementación de operaciones por filas en un número desconocido de columnas en fórmulas de columna no es muy sencilla (sin embargo, no se requiere magia).
A continuación se presentan algunas ideas aprovechando las variables locales:
// Solo una tabla de ejemplo
norte = 5 ;
no. = 10 ;sin embargo
dt = Nueva tabla ( "Resumen de proyección" , Agregar filas ( no. ) , Agregar varias columnas ( "X" , norte , personaje )) ;
Para ( i = 1 , i <= norte , i ++,
Columna ( dt , i ) << Establecer cada valor ({ "protegido" , "sin filtrar" }[ 1 + ( Entero aleatorio ( 1 , no. ) > 1 )])
) ;
// Nueva columna indicando si alguna columna contiene "screened"
dt << Nueva columna ( "Apantallado" ,
Personaje ,
Fórmula (
Local ({ i = 0 , norte = columna N ( Tabla de datos actual ()) - 1 } ,
Si ( Contiene ( Repetir ({ i ++ ; Columna ( i )[]} , norte ) , "protegido" ) ,
"protegido"
)
)
)
) ;
// Lo mismo pero con un bucle For(); código menos ordenado pero probablemente más eficiente que Repeat() para n grande
// porque no se construyen listas intermedias
dt << Nueva columna ( "Apantallado 2" ,
Personaje ,
Fórmula (
Local ({ i , norte = columna N ( Tabla de datos actual ()) - 2 , s = "" } ,
Para ( i = 1 , i <= norte , i ++,
Si ( Columna ( i )[] == "protegido" ,
s = "protegido" ;
Romper () ;
)
) ;
s ;
)
)
) ;
// Alternativamente, devuelve nr de "screened"
dt << Nueva columna ( "Nº de Proyectados" ,
Numérico ,
Fórmula ( Local ({ i = 0 , norte = columna N ( Tabla de datos actual ()) - 3 } , Suma ( Repetir ({ i ++ ; Columna ( i )[] == "protegido" } , norte )))) ) ;
gracias jim ya que no sé el número de columnas, intentaré poner su ecuación en un expr() usando un ciclo for, y luego mover esto a la declaración if con un eval() de la expresión generada en el ciclo for .
Utilizo una suma bouliana para resolver el problema del que está hablando.Si tiene 4 columnas, a,b,c,d, he usado una fórmula de:
If(sum(a=="screened",b=="screened",c=="screened",d=="screened")>0, "screened","")