如何在R中编写SAS宏?

时间:2017-09-11 10:31:53

标签: r

我想测试我的团队在R中制作的SAS代码,以比较我们从每个人那里得到的估计但是对R来说是新的并没有太多运气。在SAS中,我们编写了3个宏来生成三个独立的估计值(HFS010,HFS011,HFS012),这里给出了一个例子;

%macro HFS010 (peninc_var, pengn_var, pentax_var, pentype_var, HFS010_x_var);
    do i = 1 to dim(pentypex);
        if &pentype_var = 1 and &pengn_var = 1 then &HFS010_x_var = &peninc_var;
        else if &pentype_var = 1 and &pengn_var = 2 then &HFS010_x_var = &peninc_var + &pentax_var;
    end;
%mend HFS010;

基本上,我们的想法是每个宏都会对养老金总收入进行估算(因此,如果适用,还会从养老金收入中扣除退税金额)。有三个宏,因为我们需要对pentype = 1(HFS010),pentype = 2(HFS011)和pentype = 3到7(HFS012)的案例进行单独估计,并且调查最多接受16个退休金条目。

为了尝试在R中生成上述代码的等价物,我写了以下内容;

for(i in 1:16) {
pens_data[[paste0("HFS010_",i)]] <- case_when(
pens_data[[paste0("pentype",i)]] == 1 & pens_data[[paste0("pengn",i)]] == 1 ~ pens_data[[paste0("peninc",i)]],
pens_data[[paste0("pentype",i)]] == 1 & pens_data[[paste0("pengn",i)]] == 2 ~ pens_data[[paste0("peninc",i)]] + pens_data[[paste0("pentax",i)]],
TRUE ~ 0)

此代码不会产生错误,但在检查估算值时,有些情况应该将估算值留空。

有人知道在R中编写宏的方法吗?我想为HFS010,HFS011,HFS012中的每一个编写一个可能的函数,但对R来说是新手,我不知道如何解决这个问题。 如果有人对我的R代码为什么没有产生正确的估计,或者他们如何在R中编写相当于SAS宏的任何建议,我将不胜感激!我曾尝试使用defmacro,但无法正常工作而没有错误。

非常感谢! 艾希莉

1 个答案:

答案 0 :(得分:1)

有很多方法可以在R中写这个。但首先是一个评论的副本:

  • R对矢量很好,所以我们应该尽可能地操纵矢量。这要快得多,并且可以避免因副作用而导致循环缓慢。
  • 为了帮助其他人给您答案,请提供涵盖两种用例的可重复示例。

例如:

set.seed(1)
dx <- data.frame(
              peninc_var=sample(c(1,3),5,TRUE),
              pengn_var=sample(c(1,2),5,TRUE),
               pentax_var=1:5)

这是基础R中的一个选项。我正在使用ifelse创建新变量 HFS010_x_var

dx$HFS010_x_var <- 
with(dx,{
## I am adding a last NO condition here  to assign missing NA
ifelse(peninc_var==1 & pengn_var==1,peninc_var,
       ifelse(peninc_var==1 & pengn_var==2,peninc_var + pentax_var,NA))
})

  peninc_var pengn_var pentax_var HFS010_x_var
1:          1         2          1            2
2:          1         2          2            3
3:          3         2          3           NA
4:          3         2          4           NA
5:          1         1          5            1

另一种选择(更多糖语法)是使用data.table

library(data.table)
setDT(dx)
dx[peninc_var==1 & pengn_var==1,HFS010_x_var := peninc_var]
dx[peninc_var==1 & pengn_var==2,HFS010_x_var := peninc_var+pentax_var]