我正在尝试使用 Haskell 进行数据分析。因为我的数据集相当大(数十万甚至数百万个观察值),所以我希望使用未装箱的数据结构来提高效率,比如 Data.Vector.Unboxed。
问题是数据包含一些缺失值。我想避免将它们编码为“99”或类似的,因为这只是一个丑陋的黑客和潜在的错误来源。从我的 Haskell 新手的角度来看,我可以想到以下选项:
- 未打包值的盒装向量
Maybe
。类似的东西(如果有错误请更正):
data myMaybe a = Nothing | Just {-# UNPACK #-} !a
- (unboxable)元组的未装箱向量,带有指示缺失的布尔元素:
newtype instance Data.Vector.Unboxed.Vector (MyDatum a) = MyDatum (Data.Vector.Unboxed.Vector (Bool,a))
这可能与此问题的 OP 选择的方法相同(模数Int
)Bool
,但唯一的答案似乎没有明确解决缺失的问题值/稀疏性(而不是专注于如何表示整个数组未装箱,而不是作为未装箱向量的装箱向量)。 - 一组未装箱的向量,一个带有值,另一个带有要注入缺失值的索引,或非缺失值的运行长度,或一些等效信息。这可能比选项 2 更可取。如果缺失很少?
我试图保持在向量表示中,而不是像这样,因为它是稀疏的缺失值,而不是数据。
欢迎对这些选项的相对优点/可行性/现成的可用性/可能的性能提出任何评论,或者确实是指向完全不同的替代方案的指针!
编辑:
- 有人指出,答案可能取决于我打算对数据执行什么样的操作。目前,将每个观测值存储在单个向量中似乎比每个变量更方便。由于向量中的条目因此将引用不同的变量,因此不太可能出现类似“折叠”的操作。
- 我猜 2. 会在内部存储“有效位”向量 à la 3. 如果合适的话会自动存储,所以 3. 可以被删除吗?