2017-10-08 37 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:); 
... 
相关问题