我对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中具有相似前缀但不同后缀的不同对象。我也考虑过使用粘贴功能。对此有任何帮助将非常感激。
答案 0 :(得分:8)
总是需要进行一些调整,从宏观重型语言(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
命令可以为您节省大量的簿记代码。