【问题标题】:Merge two data sets with indicator variable on Non-merges在非合并上合并两个具有指标变量的数据集
【发布时间】:2020-01-13 06:52:05
【问题描述】:

我有两个数据集。让我们称它们为主数据和使用数据。我使用 3 个键将使用数据合并到主数据中。我包含了 all=TRUE 参数以保留所有合并和未合并的观察结果

merged_data <- merge(dataset1, dataset2, by=c("key1","key2","key3"), all=T)

现在我的问题。如何获取有关主数据或使用数据中是否发生未合并的信息?理想情况下,我想要一个有价值的列

1) 1 如果由于使用数据而发生非合并 2) 2 如果由于主数据而发生非合并 3) 3 如果成功合并!!

谢谢, 凯达

【问题讨论】:

  • 嗨,凯达!请定义在一个数据集中而不是另一个数据集中如何发生非合并?如果其中一个数据框中没有匹配项,则根据定义,另一个数据框中不应该有匹配项。也许提供示例数据和预期的输出。也许也在这里阅读:stackoverflow.com/a/5963610/1842673

标签: r merge


【解决方案1】:

tidyverse 可以在这里提供帮助。

anti_join()

"返回 x 中没有匹配 y 值的所有行,只保留 x 中的列。"

因此,

dataset1 %>%
    anti_join(dataset2, by = c("joinColumn")

应该给你什么在 1 但没有加入 2,并且

dataset2 %>%
    anti_join(dataset1, by = c("joinColumn")

应该给你 2 中的内容,但 1 没有加入。

【讨论】:

    【解决方案2】:

    对于任意数量的键,该过程都是相同的。您需要在每个表中有一列没有NAs(缺失值)。 (编辑:如果其中一个表中不存在这样的列,您可以像这样创建一个虚拟列:dfa$dummy1 <-1

    合并后,如果该行在另一个表中没有匹配项,则这些列将包含 NAs。然后您可以在合并表中搜索这些行,并分配适当的标志:

    set.seed(123)
    dfa <- data.frame(id=c(1,2,3,5),val1=rnorm(4))
    dfa
    #>   id        val1
    #> 1  1 -0.56047565
    #> 2  2 -0.23017749
    #> 3  3  1.55870831
    #> 4  5  0.07050839
    dfb <- data.frame(id=c(1,2,4,5),val2=rnorm(4))
    dfb
    #>   id       val2
    #> 1  1  0.1292877
    #> 2  2  1.7150650
    #> 3  4  0.4609162
    #> 4  5 -1.2650612
    dfc <- merge(dfa,dfb,all=T)
    
    dfc$flag <- 3 # Assume all rows are matched by default
    dfc$flag[is.na(dfc$val1)] <- 1 # Search for NAs in val1 for no-match due to dfA
    dfc$flag[is.na(dfc$val2)] <- 2 # Search for NAs in val2 for no-match due to dfB
    dfc
    #>   id        val1       val2 flag
    #> 1  1 -0.56047565  0.1292877    3
    #> 2  2 -0.23017749  1.7150650    3
    #> 3  3  1.55870831         NA    2
    #> 4  4          NA  0.4609162    1
    #> 5  5  0.07050839 -1.2650612    3
    

    reprex package (v0.3.0) 于 2020-01-13 创建

    【讨论】:

    • @Georgery,我在回答中提到了这一点。如果不存在这样的列,那么为每个表创建一个虚拟列就很容易了。
    • 是的。对不起。我想我只是没有仔细阅读。我会删除评论。
    【解决方案3】:

    可能效率低下,但效果很好。

    dataset1$ind_data1 <-1 
    dataset2$ind_data2 <-1
    
    merged_data_all <- merge(dataset1, dataset2, 
    by=c("key1","key2","key3", "Year"), all=T)
    View(merged_data_all)
    
    
    merged_data_all$ind_data1[is.na(merged_data_all$ind_data1)] <- 0
    merged_data_all$ind_data2[is.na(merged_data_all$ind_data2)] <- 0
    
    merge <- vector()
    for(i in 1:length(merged_data_all$ind_data1)) {
    if(merged_data_all$ind_data1[i]==1 & merged_data_all$ind_data2[i]==1) {
    merge[i] = "match"
    } else if(merged_data_all$ind_data1[i]==0 & merged_data_all$ind_data2[i]==1){
    merge[i]="dataset 2 only"
    } else{
    merge[i]="dataset 1 only"
    }
    }
    
    merged_data_all<- cbind(merged_data_all, merge)
    

    【讨论】:

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