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

R:检查一组变量是否形成唯一索引,r,data.table,R,Data.table,我有一个大的数据帧,我想检查一组(因子)变量的值是否唯一地标识数据的每一行 我目前的策略是通过我认为是指数变量的变量进行聚合 dfAgg = aggregate(dfTemp$var1, by = list(dfTemp$var1, dfTemp$var2, dfTemp$var3), FUN = length) stopifnot(sum(dfAgg$x > 1) == 0) 但这一战略需要永远的时间。如能采用更有效的方法,将不胜感激 谢谢。那么: length(unique(past

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

我目前的策略是通过我认为是指数变量的变量进行聚合

dfAgg = aggregate(dfTemp$var1, by = list(dfTemp$var1, dfTemp$var2, dfTemp$var3), FUN = length)
stopifnot(sum(dfAgg$x > 1) == 0)
但这一战略需要永远的时间。如能采用更有效的方法,将不胜感激

谢谢。

那么:

length(unique(paste(dfTemp$var1, dfTemp$var2, dfTemp$var3)))==nrow(dfTemp)

将变量粘贴到一个字符串中,获得唯一值,并将此向量的长度与数据帧中的行数进行比较。

可能
任何重复的

anyDuplicated( dfTemp[, c("Var1", "Var2", "Var3") ] )
或使用dplyr:

dfTemp %.% select(Var1, Var2, Var3) %.% anyDuplicated()

这仍然是浪费,因为
anyDuplicated
将首先将列粘贴到字符向量中

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

使用
anyDuplicated.data.frame

多大,行数和列数?添加
data.table
标记,需要7.4秒的时间快多了,谢谢。
# 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