2017-03-27 12 views
1

重複値があり、最初の値を保持したいときにdplyrの結合関数を使用して問題が発生していたので、自分自身の関数を書くことにしました。既にこれを行う関数がある場合は、私に教えてください!おそらく、書かれて効果的です。ここでR重複結合関数

は、いくつかのサンプルデータとコードです:

dt1 <- data.table(A = c(rep(1, 3), rep(2, 3)), B = rep(1:3, 2), 
        C = runif(n = 6, min = 0, max = 10)) 
dt2 <- data.table(A = c(rep(3, 3), rep(4, 3)), B = rep(1:3, 2), 
        C = runif(n = 6, min = 0, max = 10)) 
dt3 <- data.table(A = c(rep(3, 3), rep(4, 3)), B = rep(1:3, 2), 
        D = runif(n = 6, min = 0, max = 10)) 
dt4 <- data.table(A = c(rep(2, 3), rep(3, 3)), B = rep(1:3, 2), 
        D = runif(n = 6, min = 0, max = 10)) 

dt5 <- duplicate_join(dt1, dt2) 
dt6 <- duplicate_join(dt5, dt3) 
dt7 <- duplicate_join(dt6, dt4) 

duplicate_join <- function(dt1, dt2) { 

    melt1 <- dt1 %>% 
    gather(variable, value, -c(A, B), na.rm = TRUE) 
    melt2 <- dt2 %>% 
    gather(variable, value, -c(A, B), na.rm = TRUE) 

    join <- rbindlist(list(melt1, melt2), use.names = TRUE) %>% 
    distinct(A, B, variable, .keep_all = TRUE) %>% 
    spread(variable, value) 
    join 
} 

私の問題は、ユーザーが集まると重複する値をチェックする列を決定させて頂いております。この場合、ABを一般的な式にする必要があります。私はFunctionsCapturing Un-evaluated Dotsを読んで、これを行う関数のソースコードを見てみましたが(ggplot)、何の意味もありません。私は多くのテクニックを試して、エラーobject 'A' not foundまたはinvalid argument to unary operatorを取得しました。

関数呼び出しがあるかどうか私には関係ありません:

duplicate_join <- function(dt1, dt2, ...) {} 

または:

duplicate_join <- function(dt1, dt2, cols) {} 

私はちょうど関数内で動作するように...またはcolsを取得する方法を知っておく必要があります!ありがとう!

あなたが Semi Join

Dplyrパッケージから説明を探している

答えて

1

semi_join(x、y)は:xからちょうど列を保ち、一致する値をyであるxからすべての行を返します。 。セミ結合は、内部結合と異なります。内部結合は、一致する各行に対してxの1行を返します。セミ結合ではxの行は複製されません。これはフィルタリング結合です。ここにあなたのコードを使用して

はsemi_joinの例である:

#Semi Joining by equality of "B" Columns, Keeping dt1, 
#if you want to keep dt2, just change the parameters order 
dt4 <- semi_join(dt1, dt2, by = c("B" = "B")) 

Output: 

    A B   C 
1 1 1 5.3330819 
2 2 1 0.1652472 
3 1 2 4.6283878 
4 2 2 1.5570931 
5 1 3 9.6967720 
6 2 3 1.1587919 

#Semi Joining: Multiple Columns 
dt5 <- semi_join(dt1, dt2, by = c("A" = "A", "B" = "B")) 
#No output, there's no rows that satisfy "A" = "A" and "B" = "B" 
+0

あなたの助け、Cayodaのためにありがとうございました!残念ながら、 'semi_join'は動作しません。これは、あなたの例が示すように、複数のカラムの場合には機能しないからです。最初のケースでは、実際には機能しません。列 'A'の値が変更されたためです。 –

関連する問題