【问题标题】:R: Checking if a set of variables forms a unique indexR:检查一组变量是否形成唯一索引
【发布时间】:2014-04-03 10:24:02
【问题描述】:

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

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

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

但这种策略需要很长时间。更有效的方法将不胜感激。

谢谢。

【问题讨论】:

  • “大”有多大,行数和列数?

标签: r data.table


【解决方案1】:

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

这是一个大数据框的示例:

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 秒。

【讨论】:

  • 添加data.table 标签得到了回报。 ;) 快得多,谢谢。
【解决方案2】:

也许anyDuplicated

anyDuplicated( dfTemp[, c("Var1", "Var2", "Var3") ] )

或使用 dplyr:

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

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

【讨论】:

    【解决方案3】:

    怎么样:

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

    将变量粘贴到一个字符串中,获取唯一性,然后将此向量的长度与数据框中的行数进行比较。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 2012-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-13
      • 1970-01-01
      相关资源
      最近更新 更多