SAS 宏使用列表迭代 proc 频率
我有一个数据集,其中我必须对十几个组织的十几个变量运行频率。使用 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 个观察值。我缺少什么来让它遍历制造商列表并运行两个变量的频率?
下载声明: 本站所有软件和资料均为软件作者提供或网友推荐发布而来,仅供学习和研究使用,不得用于任何商业用途。如本站不慎侵犯你的版权请联系我,我将及时处理,并撤下相关内容!
-
引用 2楼
-
引用 3楼
我有一个数据集,其中包含一个 ID 列和一个要下载的 URL 列,每个 ID 有 2 个 URL,我想要下载每两个 URL 并将它们转换为一个以其 ID 命名的 PDF 文件。我想要一个...
我有一个数据集,其中包含 ID 列和要下载的 URL 列,每个 ID 有 2 个 URL,我想要下载每两个 URL 并将它们转换为一个以其 ID 命名的 PDF 文件。我想要每个 ID 一个 PDF。
# demo dataset 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 (url in df$Full_Path) { download.file(url, destfile = basename(url), method="curl", extra="-k", mode="wb") fl = list.files(full.names = T, pattern = '.png') img = image_read(fl) # read from vector of paths img2 = image_append(img, stack = TRUE) # places pics above one another image_write(img2, format="pdf", file.path(dir,paste('IMG',today(),'.pdf'))) } unlink(fl)
但在这个循环之后,所有内容都打印在一个 PDF 中,我希望每个 ID 都有一个 pdf
-
我有一个带有表单的网页,我想重新组织它。所有字段都在一个
,并对其进行重新排序,我创建了其他表。我现在想分派第一个表的字段...
我有一个带有表单的网页,我想重新组织它。所有字段都在一个
,并对其进行重新排序,我创建了其他表。现在我想在给定特定条件的情况下分派第一个表的字段。我的问题是,当我循环遍历我的元素并移动它们时,javascript 数组正在发生变化,因此缺少一些项目。
实现我的目标的最佳方法是什么?
前 :
<table id='tableForm'><tbody> <tr><td>Some Input to stay here</td></tr> <tr><td>Some Input to stay here</td></tr> <tr><td>Some Input to move to tab1</td></tr> <tr><td>Some Input to move to tab2</td></tr> <tr><td>Some Input to stay here</td></tr> <tr><td>Some Input to move to tab2</td></tr> <tr><td>Some Input to move to tab1</td></tr> </tbody></table> <table id='tab1'> <tbody></tbody> </table> <table id='tab2'> <tbody></tbody> </table>
(是的,没有类也没有 id 来选择元素,只能基于 innerText)
后 :
<table id='tableForm'><tbody> <tr><td>Some Input to stay here</td></tr> <tr><td>Some Input to stay here</td></tr> <tr><td>Some Input to stay here</td></tr> </tbody></table> <table id='tab1'><tbody> <tr><td>Some Input to move to tab1</td></tr> <tr><td>Some Input to move to tab2</td></tr> </tbody></table> <table id='tab2'><tbody> <tr><td>Some Input to move to tab2</td></tr> <tr><td>Some Input to move to tab2</td></tr> </tbody></table>
到目前为止我已经做了:
var toMove = { 'Input to move to tab1' : 'tab1', 'Input to move to tab2' : 'tab2', } $('table#tableForm')[0].firstChild.childNodes.forEach((c) => { content = $(c).find('td')[0].innerText if (toMove[content]) { $('#'+toMove[content]).appendTo(c) // <= This change *.childNodes, next iteration will miss the next element } });
鉴于 Javascript 的特性,迭代器不会遍历每个元素。当我们从节点中删除一些元素时,下一个元素将取代当前元素,并且将在下一次迭代中被遗漏。
s 和
i
做一些魔术j
,但是有没有简单的方法可以实现这一点?我不确定下面的代码是否能回答这个问题。
输出文件的名称中包含数字。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)
引用 7楼谢谢@Rui,它起作用了,但打印了 PDF 中的每个 URL,我希望与同一 id 相关的两个 URL 都在一个 PDF 中
引用 8楼请说明您的具体问题或提供更多详细信息以准确突出您的需求。根据目前的写法,很难准确说出您要求的是什么。
引用 9楼它与第一个 ID 一起工作,将两个 url 下载为 .png,然后崩溃并出现此错误:错误:“图像”参数不是魔法图像对象。–
如果你要改变一个可迭代对象,你总是可以在循环之前对其进行浅复制:
[...$('table#tableForm')[0].firstChild.childNodes].forEach((c) => { content = $(c).find('td')[0].innerText if (toMove[content]) { $('#'+toMove[content]).appendTo(c) // <= This change *.childNodes, next iteration will miss the next element } });
引用 11楼@HassanElleithy 没有文件的话很难说清楚发生了什么。你能在管道后面加一个 print(class(img)) 吗?
引用 12楼你可以使用扩展运算符并循环遍历它。假设你有一个名为的数组,
myArray
你可以使用[...myArray]
const myArray = [1,2,3]; [...myArray].forEach(arr => console.log(arr));
TAG
作者主题
作者最近主题: