使用正则表达式重命名列你好,
我有一个列表,其中包含大量要堆叠的列,其列格式名称为 TEST_BOUROUGH_GENDER,如下所示。 现在,列名称中可以缺少 BOUROUGH,这意味着列中的值来自所有 BOUROUGH(即 NYC)。 我堆叠所有 TEST_BOUROUGH_GENDER 列名称,然后创建名为 test、location 和 gender 的新列(见下文)。 当我遇到缺少 BOUROUGH 名称的列时,我想将 NYC 添加到该列名称中。 如果这可以用正则表达式来完成,我也更愿意。 非常感谢任何想法或意见。
列格式名称: CALC1_BROOKLYN_M, CALC2_QUEENS_F, CALC2_M, ..
ref = 当前数据表();
stat stack << ref stack(Source Label Column("Label"), Stacked Data Column("Data"));
stat stack << New Column("test", Formula(Right( :Label, 5 )));
stat stack << New Column("location", Formula(Regex( :Label, "_(.*)_", "\1" )));
统计堆栈<<新列(“性别”,公式(右(:标签,1)))
回复:使用正则表达式重命名列这修复了一切,现在它可以工作了! 感谢所有的支持。 我看到的最后一个改进是,有没有一种方法可以返回分隔符之前的所有内容,而不是用一长串与单词 function 的连接? 因此,例如,有没有一种方法可以将其写为 || “_ALL_” ||单词(5,cname,“_”)。 所以基本上我想要第 4 个分隔符之前的列名字符串。
Column(cname) << set name(
Word(1, cname, "_") || "_"|| Word(2, cname, "_") || "_" || Word(3, cname, "_") || "_" || Word(4, cname, "_") ||"_ALL_" || Word(5,cname,"_")
<BR />
回复:使用正则表达式重命名列如果我明白你想要什么,你可以使用 OR 子句来得到你想要的
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,"_")
)
)
);回复:使用正则表达式重命名列这就是我要的! 但是,当我尝试将其放入我的脚本时,它崩溃了。 由于 IP 问题,我在示例中使用的值 (TEST_BOUROUGH_GENDER) 不是真实值,但仅用作示例。 同样在最后一个分隔符“_”之后,该列将以 M 或 P 开头。 有没有办法用 startswith 函数包含两个可以开头的单独字符?
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,"_")
)
)
);回复:使用正则表达式重命名列只要 Bourough 不包含下划线,这就应该有效。
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)));回复:使用正则表达式重命名列这个更改名称的解决方案不使用正则表达式,但它是一段非常简单的代码:
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], "_" )
)
)
);