我正在尝试使用Haskell进行数据分析.因为我的数据集相当大(数十万甚至数百万的观测值),所以我最好使用未装箱的数据结构来提高效率,比如Data.Vector.Unboxed.
问题是数据包含一些缺失值.我想避免将它们编码为"99"或类似,因为这只是一个丑陋的黑客和潜在的错误来源.从我的Haskell新手的角度来看,我可以想到以下选项:
解压缩Maybe
值的盒装矢量.有点像(请纠正错误):
data myMaybe a = Nothing | Just {-# UNPACK #-} !a
一个未装箱的(无法使用的)元组向量,其中一个布尔元素表示缺失:
newtype instance Data.Vector.Unboxed.Vector (MyDatum a) = MyDatum (Data.Vector.Unboxed.Vector (Bool,a))
这可能与此问题的OP选择的方法相同(模数Int
为Bool
),但唯一的答案似乎没有明确解决丢失的问题值/稀疏性(而是关注如何表示整个数组未装箱,而不是作为未装箱矢量的盒装矢量).
未装箱的向量元组,一个具有值,另一个具有要注入缺失值的索引,或者非缺失值的运行长度,或某些等效信息.如果缺失很少,这可能比选项2更可取.
我试图保持在矢量表示而不是像这样的东西,因为它是稀疏的缺失值,而不是数据.
任何关于这些选项的相对优点/可行性/现成可用性/可能性能的评论,或者确实指向完全不同的替代品,都是受欢迎的!
编辑:
有人指出,答案可能取决于我打算对数据执行什么样的操作.目前,将每个观察值存储在单个向量中而不是每个变量似乎更方便.由于向量中的条目因此将引用不同的变量,因此不太可能出现"折叠"类操作.
我猜测2.如果合适,将在内部自动存储"有效位"矢量àla3.所以3.可以删除?
leftaroundab.. 6
我会选择选项3,但是你不应该使用向量来存储缺少的indizes:这会给你O(nMissing)
查找时间,除非丢失的数据非常稀疏,否则它会非常慢.Data.IntMap
应该做好这项工作,然后您可以轻松地使用该member
功能来检查索引是否指向缺少的观察.哈希表甚至更好,但可能没有必要.
我会选择选项3,但是你不应该使用向量来存储缺少的indizes:这会给你O(nMissing)
查找时间,除非丢失的数据非常稀疏,否则它会非常慢.Data.IntMap
应该做好这项工作,然后您可以轻松地使用该member
功能来检查索引是否指向缺少的观察.哈希表甚至更好,但可能没有必要.