Объединение двух наборов данных с индикаторной переменной в Non-merges - PullRequest
0 голосов
/ 13 января 2020

У меня есть два набора данных. Давайте назовем их «Основные данные» и «Использование данных». Я объединил данные об использовании с основными данными, используя 3 ключа. Я включил аргумент all = TRUE, чтобы сохранить все объединенные и не объединенные наблюдения

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

Теперь мой вопрос. Как получить информацию о том, произошло ли не слияние в основных данных или данных использования? В идеале мне нужен столбец со значением

1) 1, если не слияние произошло из-за использования данных 2) 2, если не слияние произошло из-за основных данных 3) 3, если успешное слияние !!

Спасибо, Кедар

Ответы [ 3 ]

0 голосов
/ 13 января 2020

Здесь может помочь tidyverse.

anti_join()

"возвращает все строки из x, где в y нет совпадающих значений, сохраняя только столбцы из x."

Следовательно,

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

должен давать вам то, что в 1, но не соединено 2, а

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

должно давать вам то, что в 2, но не соединяется 1.

0 голосов
/ 14 января 2020

Возможно, неэффективно, но сработало хорошо.

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)
0 голосов
/ 13 января 2020

Процедура одинакова для любого количества клавиш. Вам нужен столбец в каждой таблице, который не имеет NA s (пропущенные значения). (Изменить: если в одной из таблиц такого столбца нет, вы можете создать фиктивный столбец, например, так: dfa$dummy1 <-1)

После объединения эти столбцы будут содержать NA s, если эта строка не нет совпадений в другой таблице. Затем вы можете просто найти эти строки в объединенной таблице и назначить соответствующие флаги:

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 с помощью пакета Представление (v0 .3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...