如何转换R语言中的Stata marksample?

时间:2017-09-08 15:48:28

标签: r stata

我是Stata的新手,但我需要考虑将一段Stata代码转换为R以便以后使用。

一条Stata代码正在关注

marksample touse
quietly: keep if `touse'

从Stata的help(marksample)中,我认为marksample将为数据集的每一行提供Index,并在合格时将每一行标记为1,否则为0。有几个规则适用。

1。在观察中,标记变量设置为0,其权重为0(但请参见zeroweight选项)。 2.发出相应的错误消息,如果权重无效(例如在某些观察中小于0或为a),则一切都会停止         频率权重的非整数)。 3.在观察中,标记变量设置为0,不满足if exp。 4.在范围外的观察中,标记变量设置为0。 5.在观察中,标记变量设置为0,varlist中的任何数值变量都包含数字缺失值。 6.如果varlist中的任何变量是字符串,则在所有观察中将marker变量设置为0;请参阅选项strok以获取异常。 7.在剩余的观察中,标记变量设置为1。 使用名称touse是一种约定,而不是规则,但建议程序之间保持一致。

我是否知道R中是否还有容易转换这部分代码(包或函数)?或者我必须自己手动在R中创建规则?

1 个答案:

答案 0 :(得分:2)

最近的一个可能是

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

但如果你不在乎“touse&#39;那么你可以做到

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

如果您不需要函数包装器,您实际上可以

subset(df, bar < 0)

直接

修改

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。等效通话为1:nrow(df) %in% start:end

  2. 如果任何行缺少值,则
  3. marksample也会将touse设置为0。 R中的等价物为complete.cases(df)

  4. 如果任何列都是字符串,则
  5. marksample也会将touse设置为0。 R中的等价物为apply(df, 1, is.character)

  6. 对于权重,我不认为R像Stata那样有一个普遍的约定。几个R函数可以做权重,但没有更多的上下文我不知道如何编码。

  7. 组合1-3,与Stata合成器解析相比更接近

    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)