【问题标题】:How to distinguish whether to read in as numeric or character observations?如何区分是读入数字还是字符观察?
【发布时间】:2018-08-31 05:07:37
【问题描述】:

我有两个内容相同的数据集,但一个是制表符分隔的格式,另一个是空格分隔的格式。

Space-Delimited

Tab_Delimited

我有三个我无法弄清楚的问题,想寻求帮助。任何建议将不胜感激。

首先我用TextWrangler打开了这两个数据集,感觉用空格分隔的数据集是指数据集之间用空格隔开,每一行的观测值都在同一个位置。 另一方面,我对制表符分隔的数据集的理解是,由空格分隔的数据集和空格可能不需要变量的每一行具有相同的宽度。我的理解正确吗?我很难区分它们。

其次,我正在打印上面提到的降雪数据集,从第 5 行到第 122 行,数据集中的“T”值必须 转换为 0。

我的降雪数据的空格分隔文件的代码如下, 我的问题是关于它的日志。有很多关于“T”的警告,但我没有收到任何错误。

LOG

我应该担心这里提到的警告

"第 (i) 个月的无效数据在行..."

* Trying Space-Delimited data set;

OPTIONS Errors=200;

DATA SASWEEK.SnowSpace;
  DROP i MyTot diff;
  INFILE "&dirLSB.RochesterSnowfallSpace.txt" FIRSTOBS= 2 OBS= 122;
  INPUT Season $ Sep Oct Nov Dec Jan Feb Mar Apr May Total ;
  ARRAY Month(10) Sep -- Total;
    DO i = 1 TO 10 ;
    IF Month(i) = . THEN Month(i) = 0 ;

MyTot = sum (of Sep -- May);
diff = round (MyTot-Total, 3);
    IF diff ne 0 THEN PUT "**ERROR" MyTot= Total= diff= ;
    END;

PROC PRINT DATA=sasweek.snowspace;
    TITLE "Rochester Snowfall in Space-Delimited format";
RUN;

我的一位教授建议我应该将每月的降雪作为“角色”。所以“T”不会在日志中引起警告。我不确定我是否应该这样尝试。

最后,我尝试在 xls 文件中对相同的数据集使用“Proc Import”。

数据集为link 我的代码如下:

    * Trying Excel file ;

OPTIONS ERRORS=200;
OPTIONS MSGLEVEL=i;

PROC IMPORT OUT=SASWEEK.SNOWxls 
DATAFILE= "&dirLSB.RochesterSnowfall.xls" DBMS=xls;
GETNAMES= no;
RANGE= "Sheet1$a5:k122" ;
PROC PRINT DATA= SASWEEK.SNOWxls;
  TITLE "Rochester Snowfall in xls format";
RUN;

I received the error in the LOG saved as the HTML

我还是打印了一部分数据集,但是变量名弄乱了,输出不完整。 有什么想法吗?

感谢大家的阅读并感谢您的帮助:)

【问题讨论】:

    标签: sas


    【解决方案1】:

    带有INPUT 语句的DATA 步骤可能是最好的起点。

    警告很好,除非目标是没有警告。

    可以通过创建为其构建的输入环境来干净地读取数据文件:

    • 自定义信息zeroT 将 T(文本)转换为 0(数字)。防止警告。
    • INFILE
      • DLM='0920'x 指定制表符或空格可能会分隔数据文件值。
    • 输入
      • 用括号 ( ) 将字段 Sep 到 Total 包装起来以表示分组输入
      • 将应用于分组变量的信息说明符括在括号 ( )
      • : 列出输入修饰符,将输入解析推进到下一个非空白字符并读取直到下一个字符为空白字符。

    示例代码

    proc format;
      invalue zeroT 'T'=0 other=[best12.];
    run;
    
    data have;
      infile snowdata firstobs=2 dlm='0920'x;
      INPUT Season $ (Sep Oct Nov Dec Jan Feb Mar Apr May Total) (10 * :zeroT.) ;
    run;
    

    样本数据(来自 SP 文本查看器)

    filename snowdata "%TEMP%\roc_snowfalls.txt";
    
    * create local sample data file, text copied from sharepoint viewer;
    
    data _null_;
    file snowdata;
    input;
    put _infile_;
    datalines;
    Season   Sep     Oct     Nov     Dec     Jan     Feb     Mar     Apr     May    Total
    1884-85    0       T       1      27.1    22.2     17     3.5     19.5     T      90.3
    1885-86    0      1.7     8.2     8.4     16.9     16     6.5      7       0      64.7
    1886-87    0       T      22.2    12.5     12     18.4    6.3     1.2      0      72.6
    1887-88    0      0.2     2.2     9.3     21.3    4.1     13.2    0.4      0      50.7
    1888-89    0       T       4      15.5    17.8     22     17.5    5.4      0      82.2
    1889-90    0       T      5.7     6.1     20.2    14.8     19      T       0      65.8
    1890-91    0       0      2.1     29.2    16.1    24.6    12.2    0.3     0.1     84.6
    1891-92    0      0.1     9.7     4.7     26.4    10.3    25.1    0.8      T      77.1
    1892-93    0       T       14     19.2    15.9    29.8    8.1     9.6      0      96.6
    1893-94    0      0.5     6.1     27.6     20     29.5    5.4     13.3     0     102.4
    1894-95    0       T      11.1    22.1    26.5    23.6    9.5     0.6      0      93.4
    1895-96    0      1.5     5.9     8.7     22.5    39.1    45.1     1       0     123.8
    1896-97    0       T      5.5     13.9    20.1    13.7    8.1     5.2      0      66.5
    1897-98    0       0      10.1    18.4    32.1    26.8    1.2     2.4      0       91
    1898-99    0       T      10.6     27     16.6    16.3    21.2    4.3      T       96
    1899-00    T       T      1.3     21.5    24.7    28.5     54     1.3      0     131.3
    1900-01    0       0       17     20.3    29.8    36.9    13.7    23.8     T     141.5
    1901-02    0      0.1     14.1    14.5    23.8     23     1.2     2.3      T       79
    1902-03    0      0.1     4.1     27.7    18.1    15.6    2.4     0.3      0      68.3
    1903-04    0      0.6     4.4     16.1    27.2    17.2    10.7    19.5     T      95.7
    1904-05    0      0.2     2.1     15.8    27.5    15.2     7      0.5      0      68.3
    1905-06    0       T       4      8.4     7.6      8      15.2    1.1      0      44.3
    1906-07    0       5      5.7     18.7    11.7    15.7    3.1     2.5     1.3     63.7
    1907-08    0       0      2.2     11.6    16.5    19.8    7.9     6.3      3      67.3
    1908-09    0      0.5     4.6      10     22.5    6.1     9.7     9.8     3.3     66.5
    1909-10    0       T      1.7     14.6     22     42.7    3.4     0.5      0      84.9
    1910-11    0      2.2     15.7    29.8    9.5      30     13.5    4.7      2     107.4
    1911-12    0       0      6.5     7.5     21.5    10.8    8.8     6.9      T       62
    1912-13    0       0      7.2     6.9      10     18.6    15.2    1.3      0      59.2
    1913-14    0      0.2     0.3     14.4    15.1    21.6    27.9    7.2      0      86.7
    1914-15    0      0.8     4.7     16.1    22.9    9.8      6      0.5      0      60.8
    1915-16    0       0      3.4     14.8    8.5     35.7    43.8    0.7      0     106.9
    1916-17    0       0      11.7    24.9    22.7    16.7    14.6    2.3      T      92.9
    1917-18    0       T      7.9     29.7    17.2    12.7    10.5    1.3      0      79.3
    run;
    

    【讨论】:

    • 谢谢@Richard。我可以向您确认,在“制表符分隔”数据集中,每个观察值之间的制表符(即空白)是否具有相同的宽度?例如,[2“两个空格”1“一个空格”3“5个空格”7],这可能吗?谢谢!!
    • 标签是十六进制的'09'x,没有固有的'位置'。编辑器当然允许指定制表位在编辑会话中的位置。您可以使用 INFILE DSD(分隔的敏感数据)选项将连续的分隔符视为它们之间存在“缺失值”
    猜你喜欢
    • 1970-01-01
    • 2013-12-02
    • 2021-12-10
    • 2012-12-23
    • 2014-12-20
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多