1

我的 SAS 数据集中有一列具有 20 位 ID。当我尝试在 SAS EG 中使用 PROC SQL 过滤掉一些记录时,ID 为 1E18 的字段被截断,并且导出为我提供了每个字段中的截断值而不是实际值。

我试图创建一个数据集并定义字段值,但这没有任何影响。

这是我的示例代码

proc sql; create table a01 as select a.id, a.value from b; quit;

data a02;
set a01;
id = put(id,$30.);
run;

似乎仍然没有工作。

有谁知道我做错了什么。

4

2 回答 2

3

[假设您在 Windows 上使用 SAS - 在 *nix OS 上情况不会有太大不同] 在 SAS 下可以准确表示的最大整数是 9,007,199,254,740,992 或 2^53 或大约 16 位长 - 在大多数情况下是信用卡号通常 15-16 位长的数字变量可以存储为 SAS 中的数字变量。但是,正如您提到的,您有一个 20 位整数,它会导致该值失去一些精度并转换为科学计数法。

问题不在于 PROC SQL - 问题在于 SAS 对表示大整数的限制较小。大多数其他数据库将准确表示高达 2^64。参见 SAS 文档

于 2013-11-01T06:46:32.420 回答
1

虽然 Sashikanth 是正确的,即 SAS(等)不能安全地存储超过 15 位的数字(大多数 16 位数字,但不是全部),但这并不是这里的全部问题。(SAS 没有真正的“整数”概念,所有数字都是浮点数,因此最多只能存储 2**53。)

data a02;
set a01;
id = put(id,$30.);
run;

这错误地使用了 30 美元。格式,这是一种字符格式。在put中,格式类型由 put 的第一个参数驱动,而不是结果类型(始终是字符 -put生成字符,input生成数字)。所以$30.只有当id是一个字符变量时才合适。由于它看起来像是一个数字变量,因此它必须是:

id2 = put(id,30.);

请注意它位于id2左侧 - 您无法在同一数据步骤中将数字转换id为字符,它们必须具有不同的名称。id

您的号码也有可能事先转换为 1E18(例如通过 Excel,如果它通过那里 - Excel 也无法精确存储该数字);id如果是数字变量,您发布的数据步骤应该已经引发了几个关于字符到/从数字转换的警告。

于 2013-11-01T14:04:32.347 回答