11

我正在尝试使用 Haskell 进行数据分析。因为我的数据集相当大(数十万甚至数百万个观察值),所以我希望使用未装箱的数据结构来提高效率,比如 Data.Vector.Unboxed。

问题是数据包含一些缺失值。我想避免将它们编码为“99”或类似的,因为这只是一个丑陋的黑客和潜在的错误来源。从我的 Haskell 新手的角度来看,我可以想到以下选项:

  1. 未打包值的盒装向量Maybe。类似的东西(如果有错误请更正):
    data myMaybe a = Nothing | Just {-# UNPACK #-} !a
  2. (unboxable)元组的未装箱向量,带有指示缺失的布尔元素:
    newtype instance Data.Vector.Unboxed.Vector (MyDatum a) = MyDatum (Data.Vector.Unboxed.Vector (Bool,a))
    这可能与此问题的 OP 选择的方法相同(模数IntBool,但唯一的答案似乎没有明确解决缺失的问题值/稀疏性(而不是专注于如何表示整个数组未装箱,而不是作为未装箱向量的装箱向量)。
  3. 一组未装箱的向量,一个带有值,另一个带有要注入缺失值的索引,或非缺失值的运行长度,或一些等效信息。这可能比选项 2 更可取。如果缺失很少?

我试图保持在向量表示中,而不是像这样,因为它是稀疏的缺失值,而不是数据

欢迎对这些选项的相对优点/可行性/现成的可用性/可能的性能提出任何评论,或者确实是指向完全不同的替代方案的指针!

编辑:

  • 有人指出,答案可能取决于我打算对数据执行什么样的操作。目前,将每个观测值存储在单个向量中似乎比每个变量更方便。由于向量中的条目因此将引用不同的变量,因此不太可能出现类似“折叠”的操作。
  • 我猜 2. 会在内部存储“有效位”向量 à la 3. 如果合适的话会自动存储,所以 3. 可以被删除吗?
4

1 回答 1

6

我会选择选项 3,但是您不应该使用向量来存储缺失的索引:这会给您带来查找时间,除非缺失的数据非常稀疏,否则查找速度会非常O(nMissing)慢。应该做好这项工作,然后您可以轻松地使用该功能来检查索引是否指向缺失的观察。哈希表甚至更好,但可能不是必需的。Data.IntMapmember

于 2011-11-13T12:43:23.780 回答