【问题标题】:Removing duplicate values in R删除 R 中的重复值
【发布时间】:2020-09-16 19:04:13
【问题描述】:

我想从数据集中删除重复值。不过我不想删除整行,我想删除该值并将其留空。

以下是我正在使用的数据框示例。

  A01 A02 A03 A032 A01_CD A02_CD A03_CD A032_CD
1   4.9  NA  NA   NA    4.9     NA     NA      NA
2   4.9  NA  NA   NA     NA     NA     NA      NA
5   4.8  NA  NA   NA     NA     NA     NA      NA
9   4.8  NA  NA   NA    4.8     NA     NA      NA
16  4.7  NA  NA   NA    4.8     NA     NA      NA
18  4.7  NA  NA   NA     NA     NA     NA      NA
31  5.0  NA  NA   NA     NA     NA     NA      NA

这是我想要达到的结果。

  A01 A02 A03 A032 A01_CD A02_CD A03_CD A032_CD
1   4.9  NA  NA   NA     NA     NA     NA      NA
2   4.9  NA  NA   NA     NA     NA     NA      NA
5   4.8  NA  NA   NA     NA     NA     NA      NA
9   4.8  NA  NA   NA     NA     NA     NA      NA
16  4.7  NA  NA   NA    4.8     NA     NA      NA
18  4.7  NA  NA   NA     NA     NA     NA      NA
31  5.0  NA  NA   NA     NA     NA     NA      NA 

我一直在使用:No_Duplicates = dataset11 %>% distinct(A01, A02, A03, A032, A01_CD, A02_CD, A03_CD, A032_CD, .keep_all = TRUE) 但这会删除整行,我不希望这样。

【问题讨论】:

    标签: r duplicates tidyverse


    【解决方案1】:

    这是另一个基本 R 选项

    do.call(rbind,Map(function(x) replace(x,duplicated(x),NA),asplit(df,1)))
    

    给了

       A01 A02 A03 A032 A01_CD A02_CD A03_CD A032_CD
    1  4.9  NA  NA   NA     NA     NA     NA      NA
    2  4.9  NA  NA   NA     NA     NA     NA      NA
    5  4.8  NA  NA   NA     NA     NA     NA      NA
    9  4.8  NA  NA   NA     NA     NA     NA      NA
    16 4.7  NA  NA   NA    4.8     NA     NA      NA
    18 4.7  NA  NA   NA     NA     NA     NA      NA
    31 5.0  NA  NA   NA     NA     NA     NA      NA
    

    数据

    > dput(df)
    structure(list(A01 = c(4.9, 4.9, 4.8, 4.8, 4.7, 4.7, 5), A02 = c(NA, 
    NA, NA, NA, NA, NA, NA), A03 = c(NA, NA, NA, NA, NA, NA, NA),
        A032 = c(NA, NA, NA, NA, NA, NA, NA), A01_CD = c(4.9, NA,
        NA, 4.8, 4.8, NA, NA), A02_CD = c(NA, NA, NA, NA, NA, NA, 
        NA), A03_CD = c(NA, NA, NA, NA, NA, NA, NA), A032_CD = c(NA,
        NA, NA, NA, NA, NA, NA)), class = "data.frame", row.names = c("1",
    "2", "5", "9", "16", "18", "31"))
    

    【讨论】:

    • t(apply(df, 1L, function(x) replace(x, duplicated(x), NA))) 如果它们都是与此处相同的类型,也将起作用。
    • @BenjaminChristoffersen 是的,完全正确。这就是stackoverflow.com/a/63917415/12158757 中显示的内容
    • 哦,对不起。我认为这可能会更快,但我还没有测试过。
    【解决方案2】:

    您可以使用apply 按行将重复值转换为NA

    df[] <- t(apply(df, 1, function(x) replace(x, duplicated(x), NA)))
    

    还有purrr::pmap_df

    purrr::pmap_df(df, ~{x <- c(...);replace(x, duplicated(x), NA)})
    
    # A tibble: 7 x 8
    #    A01   A02   A03  A032 A01_CD A02_CD A03_CD A032_CD
    #  <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl>  <dbl>   <dbl>
    #1   4.9    NA    NA    NA   NA       NA     NA      NA
    #2   4.9    NA    NA    NA   NA       NA     NA      NA
    #3   4.8    NA    NA    NA   NA       NA     NA      NA
    #4   4.8    NA    NA    NA   NA       NA     NA      NA
    #5   4.7    NA    NA    NA    4.8     NA     NA      NA
    #6   4.7    NA    NA    NA   NA       NA     NA      NA
    #7   5      NA    NA    NA   NA       NA     NA      NA
    

    【讨论】:

      【解决方案3】:

      使用来自data.tabletranspose()

      library(data.table)
      foo <- function(.) replace(., duplicated(.), NA)
      df[] <- transpose(lapply(transpose(df), foo))
      df
      

      可重现的数据:

      df <- data.frame(
        A01 = c(4.9, 4.9, 4.8, 4.8, 4.7, 4.7, 5),
        A02 = NA_real_, A03 = NA_real_, A032 = NA_real_,
        A01_CD = c(4.9, NA, NA, 4.8, 4.8, NA, NA),
        A02_CD = NA_real_, A03_CD = NA_real_, A032_CD = NA_real_
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-16
        • 1970-01-01
        • 2021-05-13
        • 1970-01-01
        • 2014-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多