8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

SAS 宏使用列表迭代 proc 频率

Michu93 2月前

100 0

我有一个数据集,其中我必须对十几个组织的十几个变量运行频率。使用 proc print 很容易,但我不想多次更新 WHERE 语句...

我有一个数据集,其中我必须对十几个组织的十几个变量运行频率。使用 proc print 可以很容易地做到这一点,但我不想为了运行每个频率而更新 WHERE 语句十几次,所以我希望使用宏来简化此过程。

作为示例,我们可以使用 sashelp.cars 数据集,其中每个汽车制造商运行两个变量的频率(为简单起见)。

我编写了一个宏,希望迭代一个简单的 proc 频率,如下所示,不同之处在于该宏会遍历 WHERE 语句中的汽车制造商 \'make\' 列表并运行指定的频率。

proc freq data=sashelp.cars; 
    table Type DriveTrain;
    where make = "Honda";
run;

这是我写的宏:

%macro car_freq(dataset, n_make);
    %do i = 1 %to &n_make;
        %let maker =  %scan(make., &i);

        title "&maker";
    proc freq data=&dataset;
        where make = "&maker";
        tables type DriveTrain;
    run;
title;
%end;
%mend car_freq;

%car_freq(sashelp.cars, 38)

当我运行宏时,它运行没有错误,但显示每次迭代有 0 个观察值。我缺少什么来让它遍历制造商列表并运行两个变量的频率?

帖子版权声明 1、本帖标题:SAS 宏使用列表迭代 proc 频率
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Michu93在本站《loops》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我不确定下面的代码是否能回答这个问题。
    输出文件的名称中包含数字。

    df <- data.frame(ID = c(1,1,2,2,3,3),
                     Full_Path = c("https://test1.png","https://test1.png",
                                   "https://test1.png","https://test1.png",
                                   "https://test1.png","https://test1.png"))
    
    for(i in seq_len(nrow(df))) {
      url <- df$Full_Path[i]
      fl <- basename(url)
      download.file(url, destfile = fl, method="curl", extra="-k", mode="wb")
      img <- image_read(fl) # read from vector of paths
      img2 <- image_append(img, stack = TRUE) # places pics above one another
      
      # sprintf's format string outputs a string
      # with the formats replaced by
      #   %02d - an 2 digits integer padded with zeros
      #   %s   - a string, in this case the system date
      outfile <- sprintf('IMG_%02d_%s.pdf', i, today())
      outfile <- file.path(dir, outfile)
      image_write(img2, format = "pdf", outfile)
    }
    
    unlink(fl)
    

    编辑

    以下代码创建了一个子数据框列表, ID 并分别处理每个子数据框。它应该为每个子数据框写入一个文件,其中 ID 包含下载的图像文件的内容。

    library(magick)
    
    sp <- split(df, df$ID)
    lapply(sp, \(X) {
      i <- X$ID |> unique()
      # download and read all files, pipe to image_append
      # to combine them in one image only
      img <- sapply(X$Full_Path, \(url) {
        fl <- basename(url)
        download.file(url, destfile = fl, method="curl", extra="-k", mode="wb")
        image_read(fl)
        # clean up after reading, commented out
        # because it might be a good idea to keep
        # the files, it avoids having to read them
        # again if they are needed later
        # unlink(fl)
      }) |> image_append(stack = TRUE)
      #
      outfile <- sprintf('IMG_%02d_%s.pdf', i, Sys.Date())
      outfile <- file.path(dir, outfile)
      image_write(img, format = "pdf", outfile)
    })
    rm(sp)
    
返回
作者最近主题: