【问题标题】:How to make checking values for errors more efficient如何更有效地检查错误值
【发布时间】:2015-12-15 19:07:44
【问题描述】:

我正在处理大约 700 个大型数据集(每个数据集有大约 80 个变量和多达 200k 行)。大多数变量只允许在某个范围内或为某个值。每个数据集中都有一些错误,其值不符合这些规则。

所以,我需要以某种方式找到这些错误并将它们设为 NA。目前我正在这样做:

library(data.table)
dataset$variable[!dataset$variable %in% c(1,2,3)] <- NA
# or
dataset$variable[!(dataset$variable >= 0 &
                   dataset$variable <= 150)] <- NA
... # for 80 variables

我的问题是应用这些规则需要一些时间(最多 10 秒),我想加快这个过程。您有任何想法如何提高效率吗?或者这已经是最简单的方法了,我必须处理它?

非常感谢您!


编辑:我想知道例如:迭代行而不是列会更快吗?

【问题讨论】:

  • 您可以尝试使用data.table 包。在改善您的时间并使用相同的语法方面,它可能会更有效一些。每个数据集需要 10 秒,这意味着您需要大约 1.5 小时来处理所有数据。我假设加载数据可能需要比实际处理更长的时间
  • 我忘了提到 - 我已经在使用 data.table 包。然后我会调用错误的语法吗?是的,加载数据也需要很长时间——这就是为什么我希望这部分尽可能短。因为我认为使用fread 作为read.csv 的替代品并没有太多的节省潜力跨度>
  • 你在说什么? fread soread.csv 快得多。
  • 如果您使用data.table,那么我肯定会坚持使用fread 和子集。不确定您是否会获得很多效率。只需加载它,让她撕裂几个小时。
  • 对不起,我糟糕的英语可能有点误导......我的意思是:因为我已经在使用fread,我想我不能再在那里赢得太多时间了。跨度>

标签: r performance error-correction


【解决方案1】:

如果您正在寻找纯粹的性能,我建议您查看 data.table 包,它增强了 R 中的 data.frames。data.table 可以通过引用进行替换(无需复制)。当您在 R 中调用赋值操作 (&lt;-) 时,我认为复制了数据,这会导致大型数据集的速度变慢。

data.table 解决您的问题:

library(data.table)

# Cast as a data.table
dataset <- as.data.table(dataset)

# Do the replacement by reference with the := operation in data.table
# See ?`:=`
dataset[!variable %in% c(1,2,3), variable := NA]
dataset[variable >= 0 & variable <= 150, variable := NA]

这应该比用[&lt;- 替换常规data.frame 中的值快很多

【讨论】:

  • 现在只需要 2 秒而不是 10 秒。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 2020-06-18
  • 1970-01-01
  • 2023-02-01
  • 2010-09-16
  • 1970-01-01
相关资源
最近更新 更多