r语言 - 将两个数据集与非合并上的指示符变量合并



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

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

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

1( 如果由于使用数据而发生非合并,则为 1 2( 2 如果由于主数据而发生未合并 3( 3 如果合并成功!!

谢谢 凯达尔

tidyverse可以在这里提供帮助。

anti_join()

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

因此

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

应该给你 1 中的内容,但不用 2 连接,并且

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

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

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

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

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

创建于 2020-01-13 由 reprex 软件包 (v0.3.0(

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

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)

最新更新