2017-10-30 13 views
1

重複をすべてNAでグループ化したいのですが、同時に2つの列に重複している場合のみです。 V2およびV3。グループ単位で重複(複数の列)を置き換えます。

V1 V2 V3 V4  
1 a b c d  
2 a c b a 
2 a c b d 

最終的な結果は次のようになります。

V1 V2 V3 V4  
1 a b c d 
2 a c b a 
2 na na b d 

私は、現時点では微調整しようとしている基本的なコードは次のとおりです。

df %>% 
group_by(V1) %>% 
mutate_each(funs(replace(., duplicated(.), NA))) 

あなたが見ることができるように、このコードは正常に動作しますすべての別々の列を使用していますが、「2列に重複している場合にのみ」(たとえばmutate_each(funs(replace(., duplicated(c("V2", "V3"), NA)))またはmutate_each(funs(replace(., duplicated(df[c("V2", "V3")], NA))))によって、除外の条件を渡したい場合は、どこでも私を導きません)

複数の列を重複して正しく渡す方法に関する提案はありますか?

+0

私はあなたが 'mutate_at()'をtで使うと思いますハットケース。 –

+0

何度も試してみましたが、どちらの方法でmutate_at全体に変数を渡しても、重複しても動作しません。 mutate_atは2つの変数を同時に扱うことができないようです。 – Psych91

答えて

0

ここでの結果を達成するためにduplicatedに依存しないmutate_atを使用する方法です:

df <- read.table(text = "id V1 V2 V3 V4  
1 a b c d  
2 a c b a 
2 a c b d ", header = TRUE, stringsAsFactors = FALSE) 

library(dplyr) 
df %>% 
    group_by(id, V2, V3) %>% 
    mutate(dup_id = row_number()) %>% ungroup() %>% 
    mutate_at(vars(V2, V3), funs(if_else(dup_id > 1, NA_character_, .))) 

#> # A tibble: 3 x 6 
#>  id V1 V2 V3 V4 dup_id 
#> <int> <chr> <chr> <chr> <chr> <int> 
#> 1  1  a  b  c  d  1 
#> 2  2  a  c  b  a  1 
#> 3  2  a <NA> <NA>  d  2 

別のアプローチは、

tidyrパッケージから uniteseparateを使用することです
library(dplyr) 
library(tidyr) 

df %>% 
    unite(V2_V3, V2, V3) %>% 
    mutate_at(vars(V2_V3), funs(if_else(duplicated(.), NA_character_, .))) %>% 
    separate(V2_V3, c("V2", "V3")) 

#> id V1 V2 V3 V4 
#> 1 1 a b c d 
#> 2 2 a c b a 
#> 3 2 a <NA> <NA> d 
+0

ありがとうございました!しかし、第1のアプローチでは、 'mutate_impl(.data、dots)のエラー: 評価エラー:falseは長さ26(条件の長さ)または1ではなく、4でなければなりません。'、私はgroup_by前に(私の例では、V1はID列を参照し、2番目と3番目は同じです)。私は2番目のアプローチで得ることができるところを見ていきます - 私の実際の値が間にスペースを持つ単語(colからcolへの異なる構造)であるという問題、そして私が言葉の少し異なる構造の別のデータセットに直面する場合適用されません。 – Psych91

+0

あなたは正しい@ Psych91です。最初の例は、 'group'が使われているときには使えません。私は 'group'を使用する代わりに' duplicated'を使用して結果を達成する代わりに – markdly

+0

を使っています。これは@markdlyのおかげです!このコードを使用するすべての人に:変数を要因にする場合は、まず文字に変更してからif_elseに渡してください。 – Psych91

関連する問題