我想用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} },它不会引导我到任何地方。
有关如何正确传递多个列以进行复制的任何建议吗?
答案 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
包中的separate
和tidyr
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