2016-10-18 14 views
7

dplyr birleştirme işleminden sonra _merge gösterge değişkeninin eşdeğerini elde etmenin bir yolu var mı? Pandalar benzerBirleştirme sonrasında bir _merge göstergesi var mı?

şey esasen birleştirme nasıl geçtiğini anlatır indicator = True seçenek (kaç maç her veri kümesi, vb itibaren). İşte

df1 ve df2 arasında left join sonra, hemen df1 yılında df2 bir maç buldum kaç satır bilmek istiyorum ve bunlardan kaç

vermedi, Pandas İşte

import pandas as pd 

df1 = pd.DataFrame({'key1' : ['a','b','c'], 'v1' : [1,2,3]}) 
df2 = pd.DataFrame({'key1' : ['a','b','d'], 'v2' : [4,5,6]}) 

match = df1.merge(df2, how = 'left', indicator = True) 

bir örnektir

match 
Out[53]: 
    key1 v1 v2  _merge 
0 a 1 4.0  both 
1 b 2 5.0  both 
2 c 3 NaN left_only 

ve ben bu merge değişkeni tablolaştırıyoruz edebilirsiniz:

match._merge.value_counts() 
Out[52]: 
both   2 
left_only  1 
right_only 0 
Name: _merge, dtype: int64 
bir, diyelim ki, burada bir şey eksik dplyr

key1 = c('a','b','c') 
v1 = c(1,2,3) 
key2 = c('a','b','d') 
v2 = c(4,5,6) 
df1 = data.frame(key1,v1) 
df2 = data.frame(key2,v2) 

> left_join(df1,df2, by = c('key1' = 'key2')) 
    key1 v1 v2 
1 a 1 4 
2 b 2 5 
3 c 3 NA 

katılmak gittikten sonra herhangi bir seçenek mevcut görmüyorum

? Teşekkürler!

+1

Sana bir gösterge değişkeni oluşturabilirsiniz tahmin 'x' ve 'y' yani 'x $ birleştirme <- 1; Y $ birleştirme; left_join (x, y, by = "key") Eğer sorunu anlarım. – akrun

+0

soldan bir izleyecekseniz, sadece – C8H10N4O2

cevap

2

Biz birleştirme veya katılmak her türlü yaparken benzer yeni bir değişken _merge yaratır bind_rows

d1 <- inner_join(df1, df2, by = c('key1' = 'key2')) %>% 
        mutate(merge = "both") 
bind_rows(d1, anti_join(df1, df2, by = c('key1' = 'key2')) %>% 
      mutate(merge = 'left_only')) 
+0

numaralı telefondan beklemenizi beklemiyorsunuz ama bu harika bir seçenek. Teşekkürler! –

+1

@Noobie Yapılan bir sonraki sürümde – akrun

+2

bitmesini sağlamak için dplyr içinde bir özellik isteği oluşturabilirsiniz. teşekkürler akrun! –

5

Stata ile satırları bağlamak ardından inner_join, anti_join ve dayalı 'birleştirme' sütunu oluşturun. Ben de bunu gerçekleştirdikten sonra hızlı bir şekilde birleştirme teşhisi için bir seçenek olarak yararlı buluyorum.

Son birkaç ay boyunca, dplyr birleştirmelerini basitçe yazdığım temel işlevleri kullanıyorum. Bunu yapmanın daha etkili yolları vardır, ancak burada full_join'u süsleyen bir örnek var. .merge = T seçeneğini ayarlarsanız, .merge adı verilen ve Stata veya Pandas'daki gibi bir değişken alırsınız. (Bu, aynı zamanda, kaç durumda eşleştiğini ve her kullandığınızda eşleşmediğiyle ilgili bir tanılama mesajını da yazdırır.) Sorunun cevabını zaten biliyorsunuzdur, ancak eğer bir işlev istiyorsanız, aynı şekilde çalışan bir tekrar tekrar kullanabilirsiniz. dplyr'da full_join'a, buradan bir başlangıçtır. Açıkçası Örnek olarak

full_join_track <- function(x, y, by = NULL, suffix = c(".x", ".y"), 
         .merge = FALSE, ...){ 

# Checking to make sure used variable names are not already in use 
if(".x_tracker" %in% names(x)){ 
    message("Warning: variable .x_tracker in left data was dropped") 
} 
if(".y_tracker" %in% names(y)){ 
    message("Warning: variable .y_tracker in right data was dropped") 
} 
if(.merge & (".merge" %in% names(x) | ".merge" %in% names(y))){ 
    stop("Variable .merge already exists; change name before proceeding") 
} 

# Adding simple merge tracker variables to data frames 
x[, ".x_tracker"] <- 1 
y[, ".y_tracker"] <- 1 

# Doing full join 
joined <- full_join(x, y, by = by, suffix = suffix, ...) 

# Calculating merge diagnoses 
matched <- joined %>% 
    filter(!is.na(.x_tracker) & !is.na(.y_tracker)) %>% 
    NROW() 
unmatched_x <- joined %>% 
    filter(!is.na(.x_tracker) & is.na(.y_tracker)) %>% 
    NROW() 
unmatched_y <- joined %>% 
    filter(is.na(.x_tracker) & !is.na(.y_tracker)) %>% 
    NROW() 

# Print merge diagnoses 
message(
    unmatched_x, " Rows ONLY from left data frame", "\n", 
    unmatched_y, " Rows ONLY from right data frame", "\n", 
    matched, " Rows matched" 
) 

# Create .merge variable if specified 
if(.merge){ 
    joined <- joined %>% 
     mutate(.merge = 
        case_when(
         !is.na(.$.x_tracker) & is.na(.$.y_tracker) ~ "left_only", 
         is.na(.$.x_tracker) & !is.na(.$.y_tracker) ~ "right_only", 
         TRUE ~ "matched" 
         ) 
       ) 
} 

# Dropping tracker variables and returning data frame 
joined <- joined %>% 
    select(-.x_tracker, -.y_tracker) 
return(joined) 
} 

... bu işi yapmak için yüklenen dplyr gerekir:

data1 <- data.frame(x = 1:10, y = rnorm(10)) 
data2 <- data.frame(x = 4:20, z = rnorm(17)) 
full_join_track(data1, data2, .merge = T) 
İlgili konular