R:检查一组变量是否形成唯一索引

tch*_*rty 4 r data.table

我有一个大数据框,我想检查一组(因子)变量的值是否唯一标识数据的每一行。

我目前的策略是按我认为是索引变量的变量进行聚合

dfAgg = aggregate(dfTemp$var1, by = list(dfTemp$var1, dfTemp$var2, dfTemp$var3), FUN = length)
stopifnot(sum(dfAgg$x > 1) == 0)
Run Code Online (Sandbox Code Playgroud)

但这个策略需要永远。更有效的方法将不胜感激。

谢谢。

Aru*_*run 6

data.table软件包提供了非常快的duplicated,并unique为方法data.table秒。它还有一个by=参数,您可以在其中提供应计算重复/唯一结果的列。

这是一个大型 data.frame 的示例:

require(data.table)
set.seed(45L)
## use setDT(dat) if your data is a data.frame, 
## to convert it to a data.table by reference
dat <- data.table(var1=sample(100, 1e7, TRUE), 
                 var2=sample(letters, 1e7, TRUE), 
                 var3=sample(as.numeric(sample(c(-100:100, NA), 1e7,TRUE))))

system.time(any(duplicated(dat)))
#  user  system elapsed
# 1.632   0.007   1.671
Run Code Online (Sandbox Code Playgroud)

这需要 25 秒使用anyDuplicated.data.frame.

# if you want to calculate based on just var1 and var2
system.time(any(duplicated(dat, by=c("var1", "var2"))))
#  user  system elapsed
# 0.492   0.001   0.495
Run Code Online (Sandbox Code Playgroud)

使用anyDuplicated.data.frame.这需要 7.4 秒。