2017-09-11 13 views
3

私のチームがRで作成したSASコードをテストして、新しいものから新しいものへの見積もりを比較してみましょう。 SASでは、3つのマクロを作成して3つの個別の見積もり(HFS010、HFS011、HFS012)を作成しました。 RにSASマクロを書き込む方法は?

%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)の場合、別途見積もりが必要なため、3つのマクロがあり、調査では、

上記のコードと同等のものを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コードが正しい見積もりを出していない理由や、SASマクロと同等のものをRに書き込む方法について何か提案があれば、それは非常に感謝しています!私はdefmacroを使用しようとしましたが、これをエラーなく動作させることはできませんでした。

ありがとうございます! アシュリー

答えて

1

R.でこれを書くしかし、最初のコメントのcopuleする多くの方法があります。

  • 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) 

私はifelse使用して新しい変数HFS010_x_varを作成していますベースR.におけるオプション:

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] 
関連する問題