如何存储复杂的表和结构?

数据挖掘 数据
2022-02-17 11:25:00

我想知道存储复杂表和结构的一般方法。例如,假设我有一张这样的表:

               A1 A2 A3 A4 A5 B1 B2 B3 B4 B5 C1 ....Z5
 individuals   
 1             .  .  .  .  . .  .  .  .  .
 2             .  .  .  .  . .  .  .  .  .
 3             .  .  .  .  . .  .  .  .  .
 4             .  .  .  .  . .  .  .  .  .
 5             .  .  .  .  . .  .  .  .  .
 ...           .  .  .  .  . .  .  .  .  .

(我只是显示行名和列名(变量),但表格会被填满,或者可能更大,有 A1 到 A999、B1 到 B999 列。)

我可以对所有列或所有列执行一些计算。由于处理这么多列可能很困难,因此最好将其写为:Axx3

 i  subcase  A B C ... Z
 1  1      .  .  .  .  
 1  2      .  .  .  .  
 1  3      .  .  .  .  
 1  4      .  .  .  .  
 1  5      .  .  .  .  
 1  6      .  .  .  .  
 1  7      .  .  .  .  
 1  8      .  .  .  .  
 1  9      .  .  .  .  
 2  1      .  .  .  .  
 2  2      .  .  .  .  
 ...       .  .  .  .  

我记得多次看到这种结构,有时称为长格式之后,可以对所有符合“case”条件的行执行任意操作。这有一些优点,但可能会令人困惑。

例如,仅来自或当时,可以平均或创建所有\text{ subcase行的差异。subcase==1individual==1individual==subcase

但是存储结果数字的最佳方式是什么——按列还是按行?如果我想存储所有行的平均值,我需要在满足该条件的每一行上重复该数字。subcase==1

另一种选择是保留格式结构,但有 2 行用于标题 - 一个用于字母,第二个用于数字。我认为这可能是一种自然的方式,但我以前从未见过。

人们是否可以针对此问题或更复杂的情况(例如树)推荐其他结构?

3个回答

第三范式

个人ID CatID
CaseID

主键:IndvidualID、CatID、CaseID

如果您需要约束 CatID 和/或 CaseID,则使用 FK

从该结构中,您可以轻松循环并创建长格式或多维数组。
它也是节省空间的,因为 null 就是没有行。

在 sql 中的平均值

select CatID, avg(value)  
  from table 
 where CaseID = x 
 group by CatID  

或者你可以只循环那些相同的约束
或者像LINQ这样的工具

这完全取决于您要完成的工作。例如,如果您想节省空间并且您有稀疏数据,您希望您的表像您描述的那样增长“长”,并让缺少一行表示您没有数据(而不是将您的稀疏字段构造为一列,通常需要空间来存储您的空数据点)。

如果您需要一种最容易“处理”数据的数据结构,这取决于您的流程是什么。有时,复杂的嵌套数据结构是最好的(例如,JSON),有时,一些字段具有重复值的平面表是最好的。

坦率地说,我真的不明白为什么这对你来说是个问题。如果您想要通用解决方案,我会说将其保存到 csv 文件。具有 30,000 行和 1,000 列的文件并没有那么大。即使是带有简单单衬管的壳管也可以完成您提到的任务。例如,下面的单行计算位于 data.csv 的 Ax 行和 x3 列的单元格的平均值(我通过填充随机整数生成这个大小为 30,000x1,000 的数据矩阵)

cat data.csv | perl -F',' -lane 'BEGIN{ $avg=0; $num=0; $row=0; } $row++; next if( $row%3!=0);foreach $i (0..$#F){ if($i%26 == 0){ $avg+=$F[$i]; $num++;} }END{ print "avg=" . ($avg/$num); print "num=$num"; }' 
avg=0.1998
num=390000

在我的笔记本电脑上大约需要 3 秒。您可以放置​​任何感兴趣的条件来过滤数据、收集过滤后的条件并计算统计数据。

由于对于任何复杂的条件,您最多扫描每个元素一次,因此复杂性最多是线性的。即使对于大数据文件,这也不是什么大问题。顺便说一句,添加额外的辅助只是为了提前“预先计算”一些东西。