2016-09-14 3 views
2

時々、私はdplyrチェーン内のデータフレームを(通常は変更された)自身のバージョンに結合する必要があります。このようなもの:dplyrチェーン内でデータフレームを自分自身に参加させるにはどうすればよいですか?

df <- data.frame(
    id = c(1,2,3) 
    , status = c('foo','bar','meh') 
    , spouseid = c(4,3,2) 
) 


df %>% 
    filter(status == 'foo' | status == 'bar') %>% 
    # join the filtered table to itself using the dot as the right-hand side 
    left_join(., by = c('id' = 'spouseid')) 

これを試してみると、Error in is.data.frame(y) : argument "y" is missing, with no defaultとなります。

+0

元のデータフレームを変更したフレームに結合したいのですか?もしそうなら、joinラインは 'left_join(df、by = c( 'id' = 'spouseid'))'とすることができます。これにより元のデータフレームがrhsに格納されます。最終結果のどの行に応じて、これを 'right_join'または' full_join'に変更することもできます。 – eipi10

+0

私はチェーンを壊すことなく、編集されたデータフレームを自分自身に結合することに最も関心があります。過去には、私はいつも私の編集を最初に行い、新しいオブジェクトにそれを保存してから、結合を行ったり、y引数の結合自体で同じ編集を行ったりしていました。 – crazybilly

答えて

4

問題は、ドットを使用すると左端がちょうど動くので、上に書いたようにlhsをleft_join()に渡すだけです。二回のドットを使用し、左側と右側の両方のためのドットを使用するには:

df %>% 
    filter(status == 'foo' | status == 'bar') %>% 
    # the first dot is x argument and the second dot is the y argument 
    left_join(
     x = . 
    , y = . 
    , by = c('id' = 'spouseid') 
) 

をこの方法で、あなたはleft_join()の両方の引数にLHSを渡すのではなくあなたのようmagrittrの暗黙のLHSに頼っています通常はそうです。

+0

'x ='と 'y ='を削除し、 'left_join(。、。by = c( 'id' = 'spouseid'))'を使うこともできます。 – steveb

関連する問題