【问题标题】:R: Flagging Sample from Same Specimen w/ Different DOBR:标记来自具有不同 DOB 的相同样本的样本
【发布时间】:2015-03-21 14:13:30
【问题描述】:

我有一个数据集,其中包含具有不同出生日期的重复样本。这显然不应该是这样,所以我试图想出一种方法来标记/标记那些特定的样本。最后,唯一旁边有 1 的样本将是具有不同 DOB 的重复样本,所有具有相同 DOB 和唯一样本的重复样本将具有 0。这是数据的简化版本。

test.df<-data.frame(specimen=c("A","A","B","C","B","D","C","D","E"), 
                    DOB=c(as.Date('2000-05-10'),as.Date('2002-04-13'),as.Date('2001-05-12'),as.Date('2003-06-01'),as.Date('2003-04-21'),as.Date('2000-10-20'),as.Date('2003-06-01'),as.Date('2000-10-20'),as.Date('2001-11-23')))
    specimen    DOB
1    A        2000-05-10
2    A        2002-04-13
3    B        2001-05-12
4    C        2003-06-01 
5    B        2003-04-21 
6    D        2000-10-20
7    C        2003-06-01
8    D        2000-10-20
9    E        2001-11-23

并且想要这样的最终结果。

 specimen        DOB       diff.dob
1    A        2000-05-10      1
2    A        2002-04-13      1
3    B        2001-05-12      1
4    C        2003-06-01      0
5    B        2003-04-21      1
6    D        2000-10-20      0
7    C        2003-06-01      0
8    D        2000-10-20      0
9    E        2001-11-23      0

识别重复显然是容易的部分,如果实际重复具有不同的 DOB,我只是无法添加 1 和 0 的额外列。任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: r duplicates date data-cleaning


    【解决方案1】:

    你可以试试ave

    test.df$diff.dob <-  with(test.df, ave(as.numeric(DOB), specimen,
                                  FUN=function(x) length(unique(x))!=1))
    

    或使用dplyr

    library(dplyr)
    test.df %>%
              group_by(specimen) %>%
               mutate(diff.dob=(n_distinct(DOB)!=1)+0)
    #    specimen        DOB diff.dob
    #1        A 2000-05-10        1
    #2        A 2002-04-13        1
    #3        B 2001-05-12        1
    #4        C 2003-06-01        0
    #5        B 2003-04-21        1
    #6        D 2000-10-20        0
    #7        C 2003-06-01        0
    #8        D 2000-10-20        0
    #9        E 2001-11-23        0
    

    或使用data.table

    library(data.table)
      setDT(test.df)[,diff.dob:= (!anyDuplicated(DOB) & .N>1)+0 , specimen][]
    

    或者base R的另一个可能选项

    indx1 <- !with(test.df, duplicated(DOB)|duplicated(DOB, fromLast=TRUE))
    tbl <- table(test.df$specimen)!=1
    (test.df$specimen %in% names(tbl)[tbl] & indx1)+0
    #[1] 1 1 1 0 1 0 0 0 0
    

    【讨论】:

    • 谢谢,一切都很好。我以前不熟悉“ave”,虽然我对 dplyr 有一点了解,但我没想过在这个例子中使用。再次感谢。
    • 你认为有没有办法使用base r,比如test.df[duplicated(test.df$specimen .....,]
    • @Brad ave 来自base R 的解决方案应该很快。如果您需要duplicated,我更新了我的帖子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多