2017-10-08 72 views
0

在以下代碼中,我有幾個變量鏈接到一週的某一天。我希望將所有相關的值在同一天重新整理(,例如sales_monday1sales_monday2歸於名爲Monday的新變量中)。 爲此,我認爲使用一個數組:通過將數組命名爲前綴來對變量進行求和

data test; 
input sales_monday1 sales_monday2 sales_tuesday sales_wednesday; 
datalines; 
1 1 2 . 
2 5 6 . 
3 20 . 1 
; 
run; 

Data test; 
    ARRAY weekDays{*} Monday Tuesday Wednesday Thursday Friday Saturday Sunday; 
    set test; 

    do i=1 to DIM(weekDays); 
     weekDays{i}= sum(of sales_ weekDays[i]:); 
    end; 
    drop i; 
run; 

我的問題是:我不能引用我的陣列中的SUM函數認爲它是一個串聯的變量名weekDays{i}= sum(of sales_ weekDays[i]:);的一部分。 這個問題的解決方案是否存在?

+0

如果您可以選擇更改數據結構,我懷疑長數據格式可能更有用。你可以在這裏查看一些問題和好處:https://cran.r-project.org/web/packages/tidyr/vignettes/tidy-data.html – Reeza

回答

0

數組並不像那樣工作。當他們不是的時候,你使用它們就好像它們是宏變量一樣。

因此,您不能在宏變量上使用:後綴。您可以通過幾種方法之一來完成此操作。首先,你可以簡單地把所有的sales變量放到一個數組中,然後按照你喜歡的順序循環遍歷這兩個變量,然後用VNAME和一些幫助來比較變量名。

Data test_sum; 
    ARRAY weekDays{*} Monday Tuesday Wednesday Thursday Friday Saturday Sunday; 
    set test; 
    array sales sales_:; 

    do i=1 to DIM(weekDays); 
     do j = 1 to dim(sales); 
     if upcase(compress(scan(vname(sales[j]),2,'_'),,'ka')) = upcase(vname(weekdays[i])) 
      then weekdays[i] = sum(weekdays[i],sales[j]); 
     end; 
    end; 
    drop i j; 
run; 

這是相當低效的,因爲你做一噸不必要的比較,所以,這可能是不適合你,如果你有一個大的數據集。這可能是一個小數據集的正確答案。

對於大型數據集,您應該使用宏語言來代替。

%macro sum_weekday(name=); 
    %let weekday = %sysfunc(compress(%sysfunc(scan(&name.,2,_)),,ka)); 
    &weekday. = sum(&weekday., &name.); 
%mend sum_weekday; 

proc sql; 
    select cats('%sum_weekday(name=',name,')') into :sumlist separated by ' ' 
    from dictionary.columns 
    where memname='TEST' and libname='WORK' 
    ; 
quit; 

data test_macro; 
    set test; 
    &sumlist; 
run; 

這是非常有效,因爲它只是每行的變量列表看一次,一次也沒有。基本上,它只是創建然而,許多類的語句

monday = sum(monday, sales_monday1); 
monday = sum(monday, sales_monday2); 
tuesday= sum(tuesday,sales_tuesday); 

等等,基於dictionary.columns這是您的SAS所有表中的變量列表。 (如果您處於服務器環境中,並且通過元數據服務器定義大量庫,則可能會很慢;您可以使用其他方法來執行此操作。)

0

只需寫出代碼即可。一週只有7天。

monday = sum(of sales_monday:); 
tuesday = sum(of sales_tuesday:); 
... 
相關問題