我想测试我的团队在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,但无法正常工作而没有错误。
非常感谢! 艾希莉
答案 0 :(得分:1)
有很多方法可以在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]