2017-09-19 1 views
0

同僚のStataコードを見直しながら、私はコマンドexpandを見つけました。Stataの展開に相当するR

私は自分のRコードで同じことをすることができて本当に大好きです。

本質的にexpandは、データセットをn回複製しますが、新しい変数を作成するオプションがあります。観測値が元々データセットに表示された場合は0、観測値が複製の場合は1です。

Rでこれを実装する簡単な方法を知っている人はいますか?それとも私自身の関数を書いたのでしょうか?

+1

'R'で' rep() 'を探します。しかし、stataの展開関数の正確な複製を得るために、それを微調整する必要があるかもしれません。小さなデータサンプルと期待される出力を分かち合うことができれば、確かに良い答えが得られます。 – TUSHAr

+1

Rユーザーのためのアクセシブルなドキュメントを提供することをお勧めします。 https://www.stata.com/manuals/dexpand.pdf StataとRを使用していることから、これがドキュメントに目を通すことから得られることは、多くの人が理解するでしょう。 –

+0

チップと編集のおかげで – Esther

答えて

2
rep_r<-function(x,n){if(n<=1){rep(x,times=1)}else{rep(x,times=n)}} 

expand_r<-function(x,n){ 
    Reduce(function(x,y) 
     {c(x,y)},mapply(rep_r,x,n)) 
} 

expand_r(c(2,3,4,1,5),c(-1,0,1,2,3)) 
#[1] 2 3 4 1 1 5 5 5 

EDIT@nicolaから提案のおかげで上記の機能は、単に次のワンライナーによって達成することができます。

expand_r<-function(x,n) rep(x,replace(n,n<1,1)) 
#>expand_r(c(2,3,4,1,5),c(-1,0,1,2,3)) 
#[1] 2 3 4 1 1 5 5 5 
+0

'Reduce'と' mapply'の必要はありません。 'rep'も' times'引数としてベクトルを受け付けるからです。スタータとの唯一の違いは、1未満の値がどのように処理されるかと思われる。したがって、関数のより効率的な方法は、 'expand_r <-function(x、n)rep(x、replace(n、n <1,1))'です。 – nicola

+0

@nicola非常に貴重なチップをありがとう。 – TUSHAr

関連する問題