【问题标题】:Replace duplicates with NAs within a row across columns用跨列的行中的 NA 替换重复项
【发布时间】:2019-01-08 22:01:53
【问题描述】:

我在 R 中有一个如下所示的数据框:

ID sex height coordinate.1 coordinate.2 coordinate.3 coordinate.4
12 m 1.81 1223 NA NA 1223
13 f 1.65 5664 4667 NA 4667
15 m 1.78 6663 NA 6663 NA

对于每一行,我只想保留四个坐标中唯一的变量。x 变量,重复的应该用 NA 替换。结果应如下所示:

ID sex height coordinate.1 coordinate.2 coordinate.3 coordinate.4
12 m 1.81 1223 NA NA NA
13 f 1.65 5664 4667 NA NA
15 m 1.78 6663 NA NA NA

关于如何实现这一点的任何想法?

【问题讨论】:

    标签: r duplicates


    【解决方案1】:

    对每一行使用applyreplace 的值是duplicatedNA

    cols <- grep("^coordinate", names(df))
    df[cols] <- t(apply(df[cols], 1, function(x) replace(x, duplicated(x), NA)))
    
    df
    #  ID sex height coordinate.1 coordinate.2 coordinate.3 coordinate.4
    #1 12   m   1.81         1223           NA           NA           NA
    #2 13   f   1.65         5664         4667           NA           NA
    #3 15   m   1.78         6663           NA           NA           NA
    

    tidyverse 的方法是为每一行创建一个 row_number()gather 所有 coordinate...group_by 行号 (ind),replaceNA 和 @ 重复987654334@ 再次以宽格式显示值。

    library(tidyverse)
    
    df %>%
      mutate(ind = row_number()) %>%
      gather(key, value, -(c(ind, ID:height))) %>%
      group_by(ind) %>%
      mutate(value = replace(value, duplicated(value), NA)) %>%
      spread(key, value) %>%
      ungroup() %>%
      select(-ind)
    
    
    #       ID sex   height coordinate.1 coordinate.2 coordinate.3 coordinate.4
    #     <int> <fct>  <dbl>        <int>        <int>        <int>        <int>
    #1       12 m       1.81         1223           NA           NA           NA
    #2       13 f       1.65         5664         4667           NA           NA
    #3       15 m       1.78         6663           NA           NA           NA
    

    【讨论】:

      【解决方案2】:

      另一个有趣的想法是避免apply(..., margin = 1, ..)

      library(tidyverse)
      
      stack(df[-c(1:3)]) %>% 
       mutate(values = replace(values, duplicated(values), NA)) %>% 
       unstack() %>% 
       bind_cols(df[c(1:3)], .)
      

      给出,

        ID sex height coordinate.1 coordinate.2 coordinate.3 coordinate.4
      1 12   m   1.81         1223           NA           NA           NA
      2 13   f   1.65         5664         4667           NA           NA
      3 15   m   1.78         6663           NA           NA           NA
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-27
        • 2021-10-15
        • 2018-04-11
        • 1970-01-01
        • 1970-01-01
        • 2019-06-10
        • 2017-10-31
        相关资源
        最近更新 更多