我有一个超过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循环的方法,但这在计算上是低效的.
谢谢
使用基本功能,最快的解决方案是:
> 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)
一种方法使用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)