仅在适当的情况下将数据转换为数字!我使用存储在表中的数据作为参数和值。由于某些参数的值可能是字符,因此数据库中的数据类型是字符。使用 SQL 脚本将数据提取到 JMP 中很容易,按参数拆分数据也很容易。但现在我有一个列表,我想将其中一些列转换为数字,但其他列则不转换。 我尝试了此操作,但令我惊讶的是,JMP 很高兴地将所有列转换为数字,并丢弃了真正的字符信息。
Tcols = dt << Get Column Names(String);
For(i=2, i<=n items(Tcols), i++,
try(column(dt,i) << Data Type(Character);
column(dt,i) << Modeling Type("Nominal"));
);
如何进行测试以仅转换数据适当数字的列。
回复:仅在适当的情况下将数据转换为数字!文斯,
感谢您的见解。我想这是一件棘手的事情,因为根据具体情况,某些字符可能有不同的含义(例如“-”或“e”)。您的代码在编写时有效,但由于缺少值而在我的集合上失败。这些可以通过 Substitute 命令中的更多参数来处理,以查找并消除字符串 "", 。
解析(代替(字符(值), "\!"\!"\!, " , ”” , “\!” , ”” , “{” , “[” , “}” , “]” ));
然而,我的所有第 2 列都是可以解释为日期的值,因此此代码也将它们解释为日期。
names default to here(1);
dt = New Table( "Test",
Add Rows( 4 ),
New Column( "Column 1",
Character,
"Nominal",
Set Values( {"A", "B", "C", "D"} )
),
New Column( "Column 2",
Character,
"Nominal",
Set Values( {"100-0001-01", "100-0001-01", "100-0001-01", "100-0001-01"} )
),
New Column( "Column 3",
Character,
"Nominal",
Set Selected,
Set Values( {"1", "2", "", "4"} )
)
);
dt = current data table();
for(i=1, i<=ncols(dt), i++,
col = Column(dt, i);
values = col << Get Values;
Try(
Parse(Substitute(char(values), "\!"\!"\!, ", "", "\!"", "", "{", "[", "}", "]"));
col << Data Type("Numeric") << Modeling Type("Continuous");
);
);
虽然不完美,但我可以使用这个或 txnelson 的代码,因为它转换为日期的列对我来说并不重要。如果我知道它被解释为日期,我可以破例。我在这组数据中没有日期。
拍
回复:仅在适当的情况下将数据转换为数字!它把它当作一个约会
MDYHMS(num("100-0001-01"))
//returns
//"01/01/0100 00:00:00"
您也许可以尝试将字符解析为矩阵,并将引号替换为空字符串
names default to here(1);
dt = New Table( "Test",
Add Rows( 4 ),
New Column( "Column 1",
Character,
"Nominal",
Set Values( {"A", "B", "C", "D"} )
),
New Column( "Column 2",
Character,
"Nominal",
Set Values( {"100-0001-01", "2", "4", "8"} )
),
New Column( "Column 3",
Character,
"Nominal",
Set Selected,
Set Values( {"1", "2", "3", "4"} )
)
);
for(i=1, i<=ncols(dt), i++,
col = Column(dt, i);
values = col << Get Values;
Try(
Parse(Substitute(char(values), "\!"", "", "{", "[", "}", "]"));
col << Data Type("Numeric") << Modeling Type("Continuous");
);
)回复:仅在适当的情况下将数据转换为数字!大部分情况下它是有效的,但经过进一步检查,有一种情况会发生奇怪的事情。
我有一些代码是带有破折号的数字。我希望他们能保持角色。
但这就是 JMP 所做的。
num("100-0001-01") 结果为 -56928614400
我不知道它是如何产生的,但因为它没有丢失,所以代码接受它作为一个数字。
回复:仅在适当的情况下将数据转换为数字!谢谢。 这有效。
我在上面复制了错误的代码。 本来应该如此。
Tcols = dt << Get Column Names(String);
For(i=2, i<=n items(Tcols), i++,
try(column(dt,i) << Data Type(Numeric);
column(dt,i) << Modeling Type("Continuous"));
);回复:仅在适当的情况下将数据转换为数字!下面是一个简单的示例,测试每列的前 10 行,如果没有找到非数字值,则将该列转换为数字
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// set all columns to character
For( i = 1, i <= N Cols( dt ), i++,
Column( i ) << set data type( character )
);
// Convert only numerics
For( i = 1, i <= N Cols( dt ), i++,
isNumeric = "NO";
For( theRow = 1, theRow <= 10, theRow++,
If( Column( i )[theRow] != "" & Is Missing( Num( Column( i )[theRow] ) ) == 1,
isNumeric = "NO";
Break();
,
isNumeric = "YES"
)
);
If( isNumeric == "YES",
Column( i ) << set data type( numeric )
);
);