【问题标题】:R - delete duplicate values based on multiple column keeping the rowR - 基于保留行的多列删除重复值
【发布时间】:2019-08-12 15:58:06
【问题描述】:

merge() 后我的数据集是这样的

id  ValueA  ValueB  ValueC  ValueD  ValueE  ValueF
1   page a  100     email   page a  300     Social
2   page b  130     social  page b  401     Email
3   page c  200     email   page c  234     Referral
4   page c  200     email   page c  345     Email
5   page c  200     email   page c  654     Social
6   page a  345     social  page d  237     Social
7   page e  200     social  page e  745     Email
8   page e  200     social  page e  675     Referral
9   page f  989     email   page f  123     social
10  page a  123     referralpage g  132     email

我想删除基于列“ValueA”、“ValueB”和“ValueC”的重复值,但保留第 4、5 和 8 行,因为 ValueD、VelueE 和 ValueF 仍然有效。

预期的输出是

 id  ValueA  ValueB  ValueC  ValueD  ValueE  ValueF
1   page a  100     email   page a  300     Social
2   page b  130     social  page b  401     Email
3   page c  200     email   page c  234     Referral
4                           page c  345     Email
5                           page c  654     Social
6   page a  345     social  page d  237     Social
7   page e  200     social  page e  745     Email
8                           page e  675     Referral
9   page f  989     email   page f  123     social
10  page a  123     referralpage g  132     email

我尝试使用 distinc()

df <- df %>% distinct(ValueA, ValueB, ValueC, .keep_all = T) 

但它会删除整行

【问题讨论】:

  • 是的,distinct 将保留/过滤掉行。它不会更新特定行位置的任何变量。

标签: r dplyr duplicates


【解决方案1】:
library(tidyverse)

# example data
dt = read.table(text = "
id  ValueA  ValueB  ValueC  ValueD  ValueE  ValueF
1   pagea  100     email   pagea  300     Social
2   pageb  130     social  pageb  401     Email
3   pagec  200     email   pagec  234     Referral
4   pagec  200     email   pagec  345     Email
5   pagec  200     email   pagec  654     Social
6   pagea  345     social  paged  237     Social
7   pagee  200     social  pagee  745     Email
8   pagee  200     social  pagee  675     Referral
9   pagef  989     email   pagef  123     social
10  pagea  123     referral pageg  132     email
", header=T, stringsAsFactors = F)

dt %>%
  group_by(ValueA, ValueB, ValueC) %>%    # for each combination of those variables
  mutate(flag = row_number()) %>%         # add the number of appearance (i.e. row number)
  ungroup() %>%                           # forget the grouping
  mutate_at(vars(ValueA, ValueB, ValueC), ~ifelse(flag > 1, "", .)) %>%  # update to empty cell if this is a duplicate row
  select(-flag) %>%                       # remove that column
  data.frame()                            # only for visualisation purpose

#    id ValueA ValueB   ValueC ValueD ValueE   ValueF
# 1   1  pagea    100    email  pagea    300   Social
# 2   2  pageb    130   social  pageb    401    Email
# 3   3  pagec    200    email  pagec    234 Referral
# 4   4                         pagec    345    Email
# 5   5                         pagec    654   Social
# 6   6  pagea    345   social  paged    237   Social
# 7   7  pagee    200   social  pagee    745    Email
# 8   8                         pagee    675 Referral
# 9   9  pagef    989    email  pagef    123   social
# 10 10  pagea    123 referral  pageg    132    email

【讨论】:

  • 不确定,它给了我一个错误 --- mutate_impl(.data, dots) 中的错误:评估错误:找不到对象“标志”。 --- @nsinghs 的解决方案有效。
  • 当您尝试运行我的示例或使用您的真实数据集时,您是否收到该错误?
【解决方案2】:

tidyverse base R 对您的问题的回答是

df[duplicated(df[, c('ValueA', 'ValueB', 'ValueC')]), 
   c('ValueA', 'ValueB', 'ValueC')] <- ""

【讨论】:

    【解决方案3】:

    此处的某些内容可能会有所帮助(在“有条件地更改列值”部分中)。 YMMV。

    https://rstudio-pubs-static.s3.amazonaws.com/314427_a1a32bf219ea405c8728e35c72060f1a.html#change-column-value-conditionally.

    【讨论】:

      【解决方案4】:

      您可以使用 dplyr 按具有要删除的重复值的列进行分组。由于您按它们进行分组而无法更改它们,因此您可以创建没有重复项的新列。

      test1<-test %>%
        group_by(ValueA, ValueB, ValueC) %>%
        mutate(ValueAA = ifelse(duplicated(ValueA), NA, ValueA),
               ValueBB = ifelse(duplicated(ValueB), NA, ValueB),
               ValueCC = ifelse(duplicated(ValueC), NA, ValueC)) %>%
        ungroup() %>%
        mutate(ValueA = ValueAA,
               ValueB = ValueBB,
               ValueC = ValueCC) %>%
        select(1:7)
      

      重复值现在已替换为 NA,但您可以进一步将 NA 替换为空白。

      【讨论】:

        猜你喜欢
        • 2017-12-29
        • 1970-01-01
        • 2016-12-02
        • 2019-10-27
        • 1970-01-01
        • 2021-05-19
        • 1970-01-01
        • 1970-01-01
        • 2021-01-31
        相关资源
        最近更新 更多