在ID中,检查匹配/差异

nzc*_*ops 9 r

我有一个超过150万行的大型数据集,来自600k个独特的主题,因此许多主题都有多行.我试图找到其中一个主题输入错误的DOB的情况.

test <- data.frame(
    ID=c(rep(1,3),rep(2,4),rep(3,2)),
    DOB = c(rep("2000-03-01",3), "2000-05-06", "2002-05-06",
     "2000-05-06", "2000-05-06", "2004-04-06", "2004-04-06")
)

> test
  ID        DOB
1  1 2000-03-01
2  1 2000-03-01
3  1 2000-03-01
4  2 2000-05-06
5  2 2002-05-06
6  2 2000-05-06
7  2 2000-05-06
8  3 2004-04-06
9  3 2004-04-06
Run Code Online (Sandbox Code Playgroud)

我所追求的是一些基本上确定'2'有错误的代码.我可以想一些关于使用for循环的方法,但这在计算上是低效的.

谢谢

Jor*_*eys 6

使用基本功能,最快的解决方案是:

> x <- unique(test[c("ID","DOB")])
> x$ID[duplicated(x$ID)]
[1] 2
Run Code Online (Sandbox Code Playgroud)

时间安排:

n <- 1000
system.time(replicate(n,{
  x <- unique(test[c("ID","DOB")])
  x$ID[duplicated(x$ID)]
 }))
   user  system elapsed 
   0.70    0.00    0.71 

system.time(replicate(n,{
  DOBError(data)
}))
   user  system elapsed 
   1.69    0.00    1.69 

system.time(replicate(n,{
  zzz <- aggregate(DOB ~ ID, data = test, FUN = function(x) length(unique(x)))
  zzz[zzz$DOB > 1 ,]
}))
   user  system elapsed 
   4.23    0.02    4.27 

system.time(replicate(n,{
   zz <- ddply(test, "ID", summarise, dups = length(unique(DOB)))
   zz[zz$dups > 1 ,]
}))
   user  system elapsed 
   6.63    0.01    6.64 
Run Code Online (Sandbox Code Playgroud)


Cha*_*ase 5

一种方法使用plyr:

library(plyr)
  zz <- ddply(test, "ID", summarise, dups = length(unique(DOB)))
  zz[zz$dups > 1 ,]
Run Code Online (Sandbox Code Playgroud)

如果基地R是你的东西,使用 aggregate()

zzz <- aggregate(DOB ~ ID, data = test, FUN = function(x) length(unique(x)))
zzz[zzz$DOB > 1 ,]
Run Code Online (Sandbox Code Playgroud)