【问题标题】:SAS Macro variable in RR中的SAS宏变量
【发布时间】:2013-06-16 05:54:55
【问题描述】:

我对 SAS 编程环境非常熟悉。我目前正在尝试学习用 R 编程。我发现使用 SAS 宏可以减少我编程中重复代码的数量。特别是,我发现使用宏变量调整数据集名称和变量名称的部分有用。但是,在 R 中我还没有找到可以复制的东西。

例如,在 SAS 中,我可以编写一个简单的宏来在两个数据集上运行 proc 方法,如下所示:

%macro means(dataset_suffix = , var1_suffix= );
proc means data = data&dataset_suffix;
var var1&var1_suffix;
run;
%mend means;
%means(dataset_suffix = _suf1, var1_suffix = _suf2);
%means(dataset_suffix = _suf3, var1_suffix = _suf4);

运行此代码会执行宏两次,从而运行以下代码

proc means data = data_suf1;
var var_suf2;
run;
proc means data = data_suf3;
var var_suf4;
run;

我研究了 R 的用户定义函数以及使用列表。我知道 R 中没有与 proc 方法直接可比的过程。但是,我的问题的重点是如何使用宏变量来引用 R 中具有相似前缀但后缀不同的不同对象。我也考虑过使用粘贴功能。对此的任何帮助将不胜感激。

【问题讨论】:

  • 我会看一下数据框的 names 属性 - 如果您执行 names(data)<-paste0("suffix",names(data2)) 之类的操作,它应该可以实现您所追求的那种东西。
  • 感谢您的这个想法。我会调查的。

标签: r list macros sas


【解决方案1】:

从宏重的语言(SAS 或 Stata)到具有实变量 (R) 的语言总是需要一些调整。最后,你会发现实变量更强大,更不容易出错。

R 中的几乎所有东西都是一流的对象。 list 可以存储几乎任何对象。这意味着您可以拥有模型对象列表data.frames,随心所欲。

datasets <- list( one=data.frame(x=runif(100),y=runif(100) ), two=data.frame(x=runif(100),y=runif(100) ) )
lm(y~x, data=datasets$one)
modelList <- lapply( datasets, function(dat) lm(y~x, data=dat) ) 

返回模型结果列表:

> modelList
$one

Call:
lm(formula = y ~ x, data = dat)

Coefficients:
(Intercept)            x  
    0.46483      0.06038  


$two

Call:
lm(formula = y ~ x, data = dat)

Coefficients:
(Intercept)            x  
    0.48379      0.00948  

然后您可以对其进行操作:

sapply(modelList,coef)
                   one         two
(Intercept) 0.46482610 0.483785135
x           0.06038169 0.009480099

开始看到力量了吗? :-)

你可以用循环做同样的事情,但是*apply 命令可以为你节省大量的记账代码。

【讨论】:

  • 感谢您向我介绍 *apply 命令。我很高兴能更多地了解它们。
  • 正确使用的 SAS 不是宏重的语言 ;)
  • 不客气。 *apply 命令是 R 之美真正开始的地方。 @Joe有使用SAS的正确方法吗? :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
相关资源
最近更新 更多