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
我有一个数据集,其中包含出生日期不同的重复样本。这显然不应该是这种情况,所以我试图想出一种方法来 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