创建数据矩阵

时间:2018-11-02 16:33:18

标签: python bash awk

我是一名数据科学家,并且正在使用一个文本文件,该文件通过在每个数据集的新行上打印参与者的ID来指定特定参与者的我有多少个数据集。第二列计算的是不同参与者的数量,

  

a 1
  1
  1
  b 2
  b 2
  c 3
  d 4
  d 4
  d 4

我现在需要创建一个矩阵,该矩阵的每个参与者都有一列,并通过将值指定为1 vs 0来指定引用该参与者的行。我有2000多个参与者,因此我无法手动或手写列出所有列号以及在何处打印内容,但必须创建规则。

文件中的列数将是第2 + 2列的最后一行的数字(在示例中应为4 + 2 = 6)。基本上,对于每一行,我需要在与(第2列中的值(参与者编号)+ 2)匹配的列中打印1。对于该行,所有其他列的值为0。因此,对于第1行,列(1 + 2 =)3的值为1,所有其他列的值为0。对于第2行,列(1 + 2 =) 3等于1,所有其他列的值为0,依此类推。

这应该看起来像这样:

  

a 1 1 0 0 0
  a 1 1 0 0 0
  a 1 1 0 0 0
  b 2 0 1 0 0
  b 2 0 1 0 0
  c 3 0 0 1 0
  d 4 0 0 0 1
  d 4 0 0 0 1
  d 4 0 0 0 1

我希望我能提供我尝试过的代码,但是我不知道从哪里开始。

希望任何人都可以提供帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

awk来营救!

$ awk 'NR==FNR{if(max<$2)max=$2; next} 
              {printf "%s %s", $1,$2; 
               for(i=1;i<=max;i++) printf " %s", i==$2; 
               print ""}' file{,}

a 1 1 0 0 0
a 1 1 0 0 0
a 1 1 0 0 0
b 2 0 1 0 0
b 2 0 1 0 0
c 3 0 0 1 0
d 4 0 0 0 1
d 4 0 0 0 1
d 4 0 0 0 1

使用这种双重扫描算法,一致性和顺序无关紧要。