【问题标题】:Is there a way to create Stata's _merge indicator variable with R's merge()?有没有办法用 R 的 merge() 创建 Stata 的 _merge 指标变量?
【发布时间】:2015-08-02 05:10:53
【问题描述】:

Stata 自动创建一个名为“_merge”的变量,表示合并后两个数据集中的匹配变量。有没有办法让 R 的 merge() 函数生成这样的变量?

【问题讨论】:

标签: r stata


【解决方案1】:

Stata_merge 的可能值是(注意merge 也可以有值 4 和 5)

              1       master             observation appeared in master only
              2       using              observation appeared in using only
              3       match              observation appeared in both

R 中,您可以通过将参数输入为all=TRUEall.x=TRUEall.y=TRUE 来做到这一点

例如,

merge(x, y, by = intersect(names(x), names(y)),by.x = by, by.y = by, all = TRUE)
 merge(x, y, by = intersect(names(x), names(y)),by.x = by, by.y = by, all.x = TRUE)
 merge(x, y, by = intersect(names(x), names(y)),by.x = by, by.y = by, all.y = TRUE)

【讨论】:

  • 感谢您的回复。这是相当费力的。我想在使用 merge() 后创建相同的 _merge 变量,然后对其应用摘要。
  • 好吧,R 不是 Stata
【解决方案2】:

我根据@Metrics 的回答编写了以下函数。它在结果数据集中创建一个变量“merge”,表示与 Stata 一样的观察结果。

stata.merge <- function(x,y, by = intersect(names(x), names(y))){

x[is.na(x)] <- Inf
y[is.na(y)] <- Inf

matched <- merge(x, y, by.x = by, by.y = by, all = TRUE)
matched <- matched[complete.cases(matched),]
matched$merge <- "matched"
master <- merge(x, y, by.x = by, by.y = by, all.x = TRUE)
master <- master[!complete.cases(master),]
master$merge <- "master"
using <- merge(x, y, by.x = by, by.y = by, all.y = TRUE)
using <- using[!complete.cases(using),]
using$merge <- "using"

df <- rbind(matched, master,using)
df[sapply(df, is.infinite)] <- NA
df
}

测试。

df1 <- data.frame(id = letters[c(1:5,8:9)], v1=c(1:5,8:9))
df1

   id v1
1  a  1
2  b  2
3  c  3
4  d  4
5  e  5
6  h  8
7  i  9

df2 <- data.frame(id = letters[1:8], v1=c(1:7,NA))
df2

  id v1
1  a  1
2  b  2
3  c  3
4  d  4
5  e  5
6  f  6
7  g  7
8  h NA

stata.merge(df1,df2, by = "id")

   id v1.x v1.y   merge
1   a    1    1 matched
2   b    2    2 matched
3   c    3    3 matched
4   d    4    4 matched
5   e    5    5 matched
6   h    8   NA matched
7   i    9   NA  master
71  f   NA    6   using
8   g   NA    7   using

【讨论】:

    【解决方案3】:

    这是(我认为)前人的 stata.merge 函数的一个更简单、更高效的版本。这假设您的数据框中没有名为“new1”或“new2”的变量。如果此假设错误,请更改此函数中的变量名称。该函数接受 3 个变量,第一个数据帧,第二个数据帧,以及要输入到合并函数的“by =”部分的值。

    stata.merge <- function(x,y, name){
      x$new1 <- 1
      y$new2 <- 2
      df <- merge(x,y, by = name, all = TRUE)
      df$stat.merge.variable <- rowSums(df[,c("new1", "new2")], na.rm=TRUE)
      df$new1 <- NULL
      df$new2<- NULL
      df
    }
    

    【讨论】:

    • 当我阅读您的代码时,您确实假设名称为new1 new2,但请说明可以更改。简单的编辑暗示。:不要做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 2011-11-26
    • 2017-02-12
    • 2021-05-14
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多