我有一个大型数据框,我想检查一组(因子)变量的值是否唯一地标识数据的每一行。
我目前的策略是通过我认为是变量的变量进行聚合
dfAgg = aggregate(dfTemp$var1, by = list(dfTemp$var1, dfTemp$var2, dfTemp$var3), FUN = length)
stopifnot(sum(dfAgg$x > 1) == 0)
但这种策略需要永远。一种更有效的方法将不胜感激。
感谢。
答案 0 :(得分:4)
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
使用anyDuplicated.data.frame
需要25秒。
# 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
使用anyDuplicated.data.frame
需要7.4秒。
答案 1 :(得分:2)
也许是anyDuplicated
:
anyDuplicated( dfTemp[, c("Var1", "Var2", "Var3") ] )
或使用dplyr:
dfTemp %.% select(Var1, Var2, Var3) %.% anyDuplicated()
这仍然是浪费,因为anyDuplicated
将首先将列粘贴到字符向量中。
答案 2 :(得分:0)
怎么样:
length(unique(paste(dfTemp$var1, dfTemp$var2, dfTemp$var3)))==nrow(dfTemp)
将变量粘贴到一个字符串中,获得唯一性,并将此向量的长度与数据框中的行数进行比较。