按组替换重复项(多列)

时间:2017-10-30 20:47:02

标签: r

我想用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)))或{{1} },它不会引导我到任何地方。

有关如何正确传递多个列以进行复制的任何建议吗?

1 个答案:

答案 0 :(得分:0)

以下是一种使用mutate_at而不依赖duplicated来实现结果的方法:

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

另一种方法是使用unite包中的separatetidyr

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