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