【问题标题】:Remove duplicate cell in a row删除一行中的重复单元格
【发布时间】:2022-01-09 00:05:49
【问题描述】:

下面的问题是关于检测一行是否有重复的单元格。 我想问一下如何删除第2,第3,....重复项(只保留一个单元格)

Removing duplicate values row-wise in R

示例;团队 #6595380(第 4 行)有一个重复成员 - 人 #24432987 出现在 Person1 列和 Person5 列中。

Team    Person1   Person2   Person3   Person4   Person5  Person6  Person7
6594794 37505959  37469784    NA         NA       NA        NA      NA
6595053 30113392  33080042  21537147  32293683    NA        NA      NA
6595201 697417    22860111  NA           NA       NA        NA      NA
6595380 24432987  32370372  11521625   362790   24432987 22312802 32432267
6595382 12317669  25645492  NA           NA       NA        NA      NA
6595444 8114419   236357    32545314  22247108    NA        NA      NA
6595459 2135269   32332907  32332907  32436550    NA        NA      NA
6595468 33590928  10905322  32319555  10439608    NA        NA      NA
6595485 33080810  33162061  NA           NA       NA        NA      NA
6595496 36901773  34931641  NA           NA       NA        NA      NA
6595523 512193    8747403   NA           NA       NA        NA      NA
6595524 32393404  113514    NA           NA       NA        NA      NA
6595526 37855554  37855512  NA           NA       NA        NA      NA
6595536 18603977  1882599   332261    10969771  712339  2206680  768785

【问题讨论】:

    标签: r


    【解决方案1】:

    如果您的目标是将重复的行转换为NA,那么您可以使用duplicated 作为逻辑值来识别重复的行(在pivot_longer 之后):

    library(tidyverse)
    
    df %>% 
      pivot_longer(cols = -Team) %>% 
      mutate(value = if_else(duplicated(cbind(Team, value)), NA_integer_, value)) %>% 
      pivot_wider(Team, names_from = name, names_sort = T)
    
    #> # A tibble: 14 × 8
    #>       Team  Person1  Person2  Person3  Person4 Person5  Person6  Person7
    #>      <int>    <int>    <int>    <int>    <int>   <int>    <int>    <int>
    #>  1 6594794 37505959 37469784       NA       NA      NA       NA       NA
    #>  2 6595053 30113392 33080042 21537147 32293683      NA       NA       NA
    #>  3 6595201   697417 22860111       NA       NA      NA       NA       NA
    #>  4 6595380 24432987 32370372 11521625   362790      NA 22312802 32432267
    #>  5 6595382 12317669 25645492       NA       NA      NA       NA       NA
    #>  6 6595444  8114419   236357 32545314 22247108      NA       NA       NA
    #>  7 6595459  2135269 32332907       NA 32436550      NA       NA       NA
    #>  8 6595468 33590928 10905322 32319555 10439608      NA       NA       NA
    #>  9 6595485 33080810 33162061       NA       NA      NA       NA       NA
    #> 10 6595496 36901773 34931641       NA       NA      NA       NA       NA
    #> 11 6595523   512193  8747403       NA       NA      NA       NA       NA
    #> 12 6595524 32393404   113514       NA       NA      NA       NA       NA
    #> 13 6595526 37855554 37855512       NA       NA      NA       NA       NA
    #> 14 6595536 18603977  1882599   332261 10969771  712339  2206680   768785
    

    如果目标是删除重复的单元格:

    library(tidyverse)
    
    df %>% 
      pivot_longer(cols = -Team, values_drop_na = T) %>% 
      distinct(Team, value, .keep_all = TRUE) %>% 
      pivot_wider(Team, names_from = name)
    
    #> # A tibble: 14 × 8
    #>       Team  Person1  Person2  Person3  Person4  Person6  Person7 Person5
    #>      <int>    <int>    <int>    <int>    <int>    <int>    <int>   <int>
    #>  1 6594794 37505959 37469784       NA       NA       NA       NA      NA
    #>  2 6595053 30113392 33080042 21537147 32293683       NA       NA      NA
    #>  3 6595201   697417 22860111       NA       NA       NA       NA      NA
    #>  4 6595380 24432987 32370372 11521625   362790 22312802 32432267      NA
    #>  5 6595382 12317669 25645492       NA       NA       NA       NA      NA
    #>  6 6595444  8114419   236357 32545314 22247108       NA       NA      NA
    #>  7 6595459  2135269 32332907       NA 32436550       NA       NA      NA
    #>  8 6595468 33590928 10905322 32319555 10439608       NA       NA      NA
    #>  9 6595485 33080810 33162061       NA       NA       NA       NA      NA
    #> 10 6595496 36901773 34931641       NA       NA       NA       NA      NA
    #> 11 6595523   512193  8747403       NA       NA       NA       NA      NA
    #> 12 6595524 32393404   113514       NA       NA       NA       NA      NA
    #> 13 6595526 37855554 37855512       NA       NA       NA       NA      NA
    #> 14 6595536 18603977  1882599   332261 10969771  2206680   768785  712339
    

    【讨论】:

    • 谢谢,但我不希望单元格向左移动
    • @m26348762: 你想让重复的单元格变成NA吗?
    • 是的,这就是我想要的
    • 然后,我编辑的解决方案可以满足您的需求,@m26348762!
    【解决方案2】:

    使用基数 R:获取重复项的索引并将其替换为 NA。

    dat[which(t(apply(dat,1,function(x) duplicated(x))), arr.ind = T)] <- "NA"
    
          Team  Person1  Person2  Person3  Person4 Person5  Person6  Person7
    1  6594794 37505959 37469784     <NA>       NA      NA       NA       NA
    2  6595053 30113392 33080042 21537147 32293683    <NA>       NA       NA
    3  6595201   697417 22860111     <NA>       NA      NA       NA       NA
    4  6595380 24432987 32370372 11521625   362790      NA 22312802 32432267
    5  6595382 12317669 25645492     <NA>       NA      NA       NA       NA
    6  6595444  8114419   236357 32545314 22247108    <NA>       NA       NA
    7  6595459  2135269 32332907       NA 32436550    <NA>       NA       NA
    8  6595468 33590928 10905322 32319555 10439608    <NA>       NA       NA
    9  6595485 33080810 33162061     <NA>       NA      NA       NA       NA
    10 6595496 36901773 34931641     <NA>       NA      NA       NA       NA
    11 6595523   512193  8747403     <NA>       NA      NA       NA       NA
    12 6595524 32393404   113514     <NA>       NA      NA       NA       NA
    13 6595526 37855554 37855512     <NA>       NA      NA       NA       NA
    14 6595536 18603977  1882599   332261 10969771  712339  2206680   768785
    

    【讨论】:

    • 我怀疑您的dplyr 解决方案不起作用——重复的单元格将被保留,我猜。你确定?
    • 嗯,好的。你说的对。我将它应用到基本 R 解决方案中已经更改的 dat。因此我得到了正确的输出。我将删除 dplyr 版本(并尝试再做一次。非常感谢!
    • 不客气!我想你可以用rowwisec_across 做到这一点,因为据我了解acrossacross 逐列操作每一列(并非所有列同时)。
    【解决方案3】:

    使用apply试试这个base R

    data.frame(Team=df1$Team, t(apply(df1[,-1], 1, function(x)
      ifelse(!is.na(x)&duplicated(as.vector(x)),NA,x))))
          Team  Person1  Person2  Person3  Person4 Person5  Person6  Person7
    1  6594794 37505959 37469784       NA       NA      NA       NA       NA
    2  6595053 30113392 33080042 21537147 32293683      NA       NA       NA
    3  6595201   697417 22860111       NA       NA      NA       NA       NA
    4  6595380 24432987 32370372 11521625   362790      NA 22312802 32432267
    5  6595382 12317669 25645492       NA       NA      NA       NA       NA
    6  6595444  8114419   236357 32545314 22247108      NA       NA       NA
    7  6595459  2135269 32332907       NA 32436550      NA       NA       NA
    8  6595468 33590928 10905322 32319555 10439608      NA       NA       NA
    9  6595485 33080810 33162061       NA       NA      NA       NA       NA
    10 6595496 36901773 34931641       NA       NA      NA       NA       NA
    11 6595523   512193  8747403       NA       NA      NA       NA       NA
    12 6595524 32393404   113514       NA       NA      NA       NA       NA
    13 6595526 37855554 37855512       NA       NA      NA       NA       NA
    14 6595536 18603977  1882599   332261 10969771  712339  2206680   768785
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      • 2014-11-11
      • 2017-07-06
      • 1970-01-01
      相关资源
      最近更新 更多