2016-10-26 74 views
0

我在一個庫中有100個數據集(稱爲DATA)。當我想將它們合併成一個數據集時,SAS會說一些被定義爲字符和數字的變量。所以我使用以下代碼通過更改變量的格式來修改問題。但是,SAS仍然報告了錯誤:當我嘗試更改格式時,變量已被定義爲字符和數字。SAS變量已被定義爲字符和數字

編輯:我改變了我的代碼,並使用input函數來解決這個問題。然而,報告同樣的錯誤如圖所示圖:enter image description here

%macro step1(sourcelib=,source=); 
proc sql noprint; /*read datasets in a library*/ 
    create table mytables as 
    select * 
    from dictionary.tables 
    where libname = &sourcelib 
    order by memname ; 

    select count(memname) 
    into:obs 
    from mytables; 

    %let obs=&obs.; 

    select memname 
    into : memname1-:memname&obs. 
    from mytables; 
quit; 

    data 
    %do i=1 %to &obs.; 
    &source.&&memname&i 
    %end; 
    ; 
    set 
    %do i=1 %to &obs.; 
    &source.&&memname&i 
    %end; 
    ; 
price1=input(price,best12.); 
volume1=input(volume,best12.); 
bid_imp__vol1=input(bid_imp__vol,best12.); 
Ask_Imp__Vol1=input(Ask_Imp__Vol,best12.); 
drop price volume bid_imp__vol ask_Imp__Vol; 
    run; 

data 
    %do i=1 %to &obs.; 
    &source.&&memname&i 
    %end; 
    ; 
    set 
    %do i=1 %to &obs.; 
    &source.&&memname&i 
    %end; 
    (rename=(price1=price volume1=volume bid_imp__vol1=bid_imp__vol Ask_Imp__Vol1=Ask_Imp__Vol)); 
    run; 
%mend; 


%step1(sourcelib='DATA',source=DATA.); 

回答

1

FORMAT並沒有任何關係做的問題。類型是問題。格式是「你希望我如何以可讀的格式打印出來」,但類型是「基本上在這塊內存中的東西」。

你需要在這裏做三件事情之一。

  1. 刪除衝突的變量。
  2. 重命名衝突變量,無論是在上一步還是在SET數據集選項中。
  3. 更改衝突變量的類型,無論是在上一步中,還是通過在SET數據集選項中重命名它們,然後轉換爲正確的類型。

在像上面的宏,有一兩件事你可以做的是使用dictionary.columns,以確定哪些變量是錯誤的類型。既然你有一組有限的變量,它看起來像(也就是說,這不需要是完全通用的),你可以選擇一種類型(聽起來像數字),並且查詢dictionary.columns以查找任何非該類型的變量。然後對那些符合標準(是字符)的人進行轉換。

你構建宏的方式會讓這個更復雜一點;我想你可能希望有一個單獨的宏,它遍歷每個數據集並將其類型轉換爲一致的類型,一次一個,然後再運行此宏。否則,將難以管理宏變量列表。

+0

bid_imp__vol1 = input(bid_imp__vol,best12。)我用來更改變量。但是,它仍然報告了同樣的錯誤。 – Neal801

+0

爲了您的分離宏的建議,您能否提供更多信息? – Neal801

+0

您必須在早期的datastep中執行該操作並刪除變量。 – Joe