有些公司规模比较大。数据库是由IT部门管理,而数据分析是由业务部门自己进行。那么数据清洗就是这两个部门的交接地带。
一次数据分析通常由IT部门负责将原始数据取出交给业务部门,然后业务部门负责数据的清洗和分析。但是,有时候,受限于IT部门的能力或者某种政策(要求数据库的表头以英文/日文形式存储),会导致数据导出以后标题是乱码或者英/日文形式存在。而导出的Excel很大,打开很花时间。我们想要在JMP里面对标题进行一次性更改。怎么做到呢?
下面举一个简单的例子:
用到的文件是样本数据库自带的:Boston Housing.jmp

我们让第一列标题改为:1,第二列标题改为:2,以此类推。如何做呢?
dt = Current Data Table();Column(dt, 1) << Set Name(“1”);Column(dt, 2) << Set Name(“2”);Column(dt, 3) << Set Name(“3”);Column(dt, 4) << Set Name(“4”);Column(dt, 5) << Set Name(“5”);Column(dt, 6) << Set Name(“6”);Column(dt, 7) << Set Name(“7”);Column(dt, 8) << Set Name(“8”);Column(dt, 9) << Set Name(“9”);Column(dt, 10) << Set Name(“10”);Column(dt, 11) << Set Name(“11”);Column(dt, 12) << Set Name(“12”);

当然因为是有规律的,所以代码可以用循环语句来简化,不过实际应用没有意义,因为正常情况每一列的列名都是不规律的。
dt = Current Data Table();
For(i = 1, i <= 12, i++, Column(dt, i) << Set Name(Char(i)););
有时候,我们的字段所处的位置是随机的,我们需要指定变更某个字段的名称,要如何做呢?此时我们采用重新编码和更改。
比如我们要指定”犯罪率”为”1”、指定”区”变更为”2”、指定”产业”变更为”3”、指定 “查尔斯河”变更为”4”、指定”氧化氮”变更为 “5”,具体代码如下:
dt = Current Data Table();names = Recode( dt << Get Column Names( String ), {Map Value( _rcOrig, {“产业”, “3”, “区”, “2”, “查尔斯河”, “4”, “氧化氮”, “5”, “犯罪率”, “1”}, Unmatched( _rcNow ) )});For Each( {name, i}, names, Column( dt, i ) << Set Name( name ););
代码含义说明:
- dt = Current Data Table();用于将当前的数据表指派给变量dt,这样后续的操作就会应用于当前数据表。
- names = Recode(…)用于重新编码列名。它通过dt << Get Column Names(String)获取当前数据表的列名,并将其转换为字符串向量。然后,它使用Recode函数和Map Value函数将列名映射到新的编码值。具体来说,它会将指定的原始列名(比如”产业”、“区”等)映射到新的数字编码(比如”3”、“2”等)。对于没有匹配到的列名,将使用Unmatched(_rcNow)表示。
- For Each({…})是一个循环语句,用于遍历names中的每个元素。在每次循环中,会从names中的每个元素中提取name和i的值,并使用Column(dt, i) << Set Name(name)将当前数据表的第i列的列名更改为指定的name。
效果如下:

如果一个公司的数据库和数据分析操作是不同的人。默认数据分析的人员编程能力是比较弱的。建议可以盯着数据库维护人员,让他们用SQL语言直接替换表头。SQL的代码如下:
ALTERTABLE 表名RENAMECOLUMN 旧列名 TO 新列名;