【问题标题】:Equivalent of Stata's expand in R相当于 Stata 在 R 中的扩展
【发布时间】:2017-09-19 10:30:20
【问题描述】:

在查看同事的 Stata 代码时,我遇到了命令 expand。

我真的很想能够在我自己的 R 代码中做同样的事情。

基本上expand 将数据集复制 n 次,但如果观察结果最初出现,则可以选择创建一个新变量,该变量为 0 在数据集中,如果观察结果是重复的,则为 1。

有谁知道在 R 中实现这个的快速方法?还是我自己写函数的情况?

【问题讨论】:

  • 在R 中查找rep()。但是您可能需要对其进行调整以获取 stata 扩展功能的精确副本。如果你能分享一小部分数据和预期的输出,你肯定会得到更好的答案。
  • 好主意是为 R 用户提供可访问的文档。 stata.com/manuals/dexpand.pdf 更多的人会通过查看文档来了解它的作用,而不是因为他们使用 Stata 和 R。
  • 感谢您的提示和编辑,我一定会在以后添加链接

标签: r stata


【解决方案1】:
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

编辑:感谢@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

【讨论】:

  • 不需要任何Reduce 和mapply,因为rep 也接受向量作为times 参数。与 stata 的唯一区别似乎是如何处理小于 1 的值。因此,更有效的函数方式可能是expand_r&lt;-function(x,n) rep(x,replace(n,n&lt;1,1))。
  • @nicola 感谢您的宝贵提示。
【解决方案2】:

此函数像 Stata expand 命令一样扩展 data.frame 的行。我从 R mefa 包中得到了这个想法。

expand_r <- function(df, ...) {
  as.data.frame(lapply(df, rep, ...))
}

df <- data.frame(x = 1:2, y = c("a", "b"))

expand_r(df, times = 3)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多