Renombrar columnas con RegexHola,
Tengo una lista de una gran cantidad de columnas para apilar que tienen el nombre de formato de columna de TEST_BOUROUGH_GENDER, como se muestra a continuación. Ahora el BOUROUGH puede faltar en el nombre de la columna y eso implica que el valor de la columna es de todos los BOUROUGHs (es decir, NYC). Apilé todos los nombres de columna TEST_BOUROUGH_GENDER y luego creando nuevas columnas llamadas prueba, ubicación y género (ver más abajo). Cuando me encuentro con el caso de una columna a la que le falta un nombre en BOUROUGH, me gustaría agregar NYC a ese nombre de columna. También preferiría que esto se hiciera con expresiones regulares. Cualquier pensamiento o entrada es muy apreciada.
nombre del formato de columna : CALC1_BROOKLYN_M, CALC2_QUEENS_F, CALC2_M, ..
ref = Tabla de datos actuales ();
stat stack << ref stack (columna de etiqueta de origen ("Label"), columna de datos apilados ("Data"));
stat stack << Nueva Columna ("prueba", Fórmula (Derecha (: Etiqueta, 5)));
stat stack << Nueva Columna ("ubicación", Fórmula (Regex (: Etiqueta, "_ (. *) _", "\ 1")));
stat stack << Nueva Columna ("género", Fórmula (Derecha (: Etiqueta, 1)))
Re: Renombrar columnas con RegexEsto arregla todo y ahora funciona! Gracias por todo el apoyo. Una mejora final que veo es que, en lugar de tener una larga cadena de concatentación con la función de palabra, ¿hay una manera de devolver todo antes del delimitador? Entonces, por ejemplo, hay una manera de escribirlo como || "_ALL_" || Palabra (5, cname, "_"). Así que básicamente quiero una cadena de nombre de columna antes del cuarto delimitador.
Column(cname) << set name(
Word(1, cname, "_") || "_"|| Word(2, cname, "_") || "_" || Word(3, cname, "_") || "_" || Word(4, cname, "_") ||"_ALL_" || Word(5,cname,"_")
<BR />
Re: Renombrar columnas con RegexSi entiendo lo que quiere, puede usar una cláusula OR para obtener lo que desea
allColNames = dt << getcolumnnames;
pulledCols = {};
for(i = 1, i <= N items(allColNames), i++,
cname = Column(allColNames[i]) << get Name;
if(startswith(Word(5,cname , "_"),"M") | startswith(Word(5,cname , "_"),"P"),
Column(cname) << set name(
Word(1, cname, "_") || "_"|| Word(2, cname, "_") || "_" || Word(3, cname, "_") || "_" || Word(4, cname, "_") ||"_ALL_" || Word(5,cname,"_")
)
)
);Re: Renombrar columnas con Regex¡Esto es lo que quiero! Sin embargo, cuando intento poner esto en mi script, se bloquea. Los valores que utilicé en mi ejemplo (TEST_BOUROUGH_GENDER) no son reales debido a problemas de IP, pero mousamente se usan como ejemplo. Además, después del último delimitador "_", la columna comenzará con M o con P. ¿Hay alguna forma con que empiece con la función para incluir dos caracteres separados con los que pueda comenzar?
allColNames = dt << getcolumnnames;
pulledCols = {};
Ncols = N items(allColNames);
for(i = 1, i <= Ncols, i++,
cname = Column(allColNames[i]) << get Name;
if(startswith(Word(5,cname , "_"),"M"),
Column(cname) << set name(
Word(1, cname, "_") || "_"|| Word(2, cname, "_") || "_" || Word(3, cname, "_") || "_" || Word(4, cname, "_") ||"_ALL_" || Word(5,cname,"_")
)
),
if(startswith(Word(5,cname , "_"),"P"),
Column(cname) << set name(
Word(1, cname, "_") || "_"|| Word(2, cname, "_") || "_" || Word(3, cname, "_") || "_" || Word(4, cname, "_") ||"_ALL_" || Word(5,cname,"_")
)
)
);Re: Renombrar columnas con RegexEsto debería funcionar siempre que Bourough no contenga un guión bajo.
dt = New Table("test",
Add Rows(3),
New Column("Label", Character, "Nominal", Set Selected, Set Values({"CALC1_BROOKLYN_M", "CALC2_QUEENS_F", "CALC2_M"}))
);
dt << New Column("test", Formula(Left(:Label, 5)));
dt << New Column("location", Formula(If(Is Missing(Regex(:Label, "_(.*)_")), "NYC", Regex(:Label, "_(.*)_", "\1"))));
dt << New Column("gender", Formula(Right(:Label, 1)));Re: Renombrar columnas con RegexEsta solución para cambiar los nombres no usa expresiones regulares, pero es un código muy simple:
Names Default To Here( 2 );
dt = Current Data Table();
colNamesList = dt << get column names( string );
For( i = 1, i <= N Items( colNamesList ), i++,
If( Word( 3, colNamesList[i], "_" ) == "",
Column( colNamesList[i] ) << set name(
Word( 1, colNamesList[i], "_" ) || "_NYC_" || Word( 2, colNamesList[i], "_" )
)
)
);