R:来自具有不同 DOB 的相同样本的标记样本

R: Flagging Sample from Same Specimen w/ Different DOB

我有一个数据集,其中包含出生日期不同的重复样本。这显然不应该是这种情况,所以我试图想出一种方法来 flag/mark 这些特定样本。最后,唯一旁边有 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 的额外列时遇到问题。任何帮助将不胜感激。谢谢。

你可以试试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