2017-09-08 1 views
2

私はStataを初めて使っていますが、後で利便性を考えてStataコードをRに変換することについて考える必要があります。Stata marksampleをR言語に変換するには?

StataのコードのワンピースはStataの中にヘルプ(marksample)から

marksample touse 
quietly: keep if `touse' 

に従っている、私はそれがあるときmarksampleは、データセットの各列にインデックスを与え、1として各行をマークするために起こっていると考え

修飾されたもの、そうでないものは0です。いくつかの規則が適用されます。

1.マーカー変数は、重みが0の観測値では0に設定されます(しかし、オプションzeroweightを参照)。 2.適切なエラーメッセージが表示され、重みが無効な場合(一部の観測では0より小さい場合や、頻度ウェイトが0以外の場合など)、すべてが停止します。 3.マーカー変数は、expが満たされない観測値では0に設定されます。 4.マーカー変数は、範囲外の観測値では0に設定されます。 5. varlistの数値変数のいずれかに数値欠損値が含まれている場合、marker変数は0に設定されます。 6. varlistの変数のいずれかが文字列である場合、marker変数はすべての観測値で0に設定されます。オプションstrokを参照してください。 7.マーカー変数は残りの観測値で1に設定されます。 名前を使用するのはルールではなく、規則ですが、プログラム間の一貫性を保つために推奨されます。

Rの中にこのコード部分を簡単に変換する(パッケージまたは関数)があるかどうかわかりますか?あるいは、Rでルールを自分で手動で作成する必要がありますか?

答えて

2

最も近い1は

foo <- function(df, condition) { 
    touse <- with(df, eval(parse(text = condition))) 
    subset(df, touse) 
} 
foo(df, "bar < 0") 

かもしれません。しかし、あなたが `touse」気にしないならば、あなたは

foo <- function(df, condition) { 
    subset(df, eval(parse(text = condition))) 
} 
foo(df, "bar < 0") 

そして、あなたはあなたができる機能のラッパーを必要としない場合に行うことができます実際に行う

subset(df, bar < 0) 

EDIT

のStataのmarksampleデフォルトでは、Stataの構文を解析し、通常はプログラムが

として定義されている場合
program foo 
    syntax [varlist] [if] [in] [fw aw pw iw] 
    marksample touse 
    quietly: keep if `touse' 
end 

上記のプログラムは、構文呼び出しを解析します。 ifには明らかな同等の機能があります。残りの:

  1. marksampleも範囲にtouse外0に設定します。同等の呼び出しは、行に欠損値がある場合はtouseを0に設定します。1:nrow(df) %in% start:end

  2. marksample Rの等価物はcomplete.cases(df)

  3. marksampleも、いずれかの列が文字列の場合は0に設定されます。Rの等価物はapply(df, 1, is.character)

  4. となるであろう。私は、RはStataのやり方と同じ普遍的な慣習を持っているとは思わない。いくつかのR関数は重み付けを行うことができますが、文脈がなければコード化する方法がわかりません。 1-3を組み合わせ

、Stataのsyntas解析に近い同等のあなたはbar`は変数の名前である `意味するか

foo <- function(df, 
       varlist = colnames(df), 
       if_condition = "TRUE", 
       in_range = 1:nrow(df)) { 
    touse <- with(df[, varlist, drop = FALSE], eval(parse(text = if_condition))) & 
      1:nrow(df) %in% in_range & 
      complete.cases(df[, varlist, drop = FALSE]) & 
      !apply(df[, varlist, drop = FALSE], 1, is.character) 
    subset(df, touse) 
} 
foo(df, varlist = c("var1", "var2"), if_condition = "var1 < 0", in_range = 2:8) 
+0

のですか?データテーブルのすべての変数、または私が興味を持っている列だけを考慮する必要がありますか? –

+0

1.はい。 2a。必要な列だけを使用する方が効率的です。ただし、Stataの場合と同様に、デフォルトではすべての列が保持されます。 2b。しかし、私の答えは 'marksample'の全てを模倣するものではありません。元の質問に基づいて、私はそれを「if」のみを解析すると解釈したと思います。指摘したように、 'marksample'はvarlistと重みも解析します。これらの変数は、Rも同様にコーディングしていない限り、Rで明白です。 – Mauricio

+0

ありがとうございます!私が重み変数を持つことができれば、あなたは 'marksample'にもっと近い結果を得ることができるのでしょうか? –

関連する問題