Convertendo dados da coluna para matriz

1

Estou tentando criar uma matriz de características de plantas e espécies de plantas. Existem 2.912.746 linhas nos dados e 3 colunas. Existem diferentes números de características para cada espécie, e nem todas as espécies possuem todas as características. O formato dos dados é delimitado por tabulações.

Formato atual -

  Species   Trait      Value
  Species_1 SLA        4
  Species_1 Photopath  C3
  Species_1 Mycorrhiza AMF
  Species_2 SLA        3 
  Species_2 Growth     10

Formato desejado -

          SLA Photopath Mycorrhiza Growth
Species_1 4   C3        AMF
Species_2 3                        10

Qualquer ajuda com isso seria apreciada pelo OH SO. Foi um grande desafio e não sei por onde começar.

Obrigado !!!!

~ Mark Anthony

    
por Mark Anthony 07.02.2016 / 19:51

1 resposta

0

Para começar, eu recomendo que você tenha todos os dados dentro de um arquivo text/plain , onde, como você escreveu, todos os dados são tab delimited .

Você pode tentar experimentar como filtrar as colunas usando cut

Exemplo

#get first column of a tab delimited file
> cut -f 1 -d $'\t' file

Depois disso, recomendo que você instale um mecanismo de banco de dados, como por exemplo mysql-server e um ambiente de trabalho como mysql-workbench .

Então, se você quiser, posso ajudá-lo a criar um banco de dados indexado com algumas funções de inserção, que o ajudarão a inserir, obter e analisar todos os dados que você precisa agora e no futuro com facilidade.

Outra opção

É alterar a extensão desse arquivo text/plain para .csv e abri-lo com LibreOffice Calc . Depois de abri-lo, selecione o tabulador como delimitador. Você poderá analisar os dados usando pivot tables , mas não tenho certeza de como conseguir a saída desejada.

Solução de bash

Primeiro, vamos criar um novo diretório para trabalhar.

> mkdir test

Copie seu arquivo de origem para esse novo diretório.

> cp source test/file

Em seguida, insira o diretório

> cd test

Agora, remova a primeira linha do arquivo (a linha de nomes de colunas)

> nano file
press ctrl+k, ctrl+x and y

Em seguida, ordene o arquivo

> sort file > file.sort

Obter todos os nomes de colunas

> cut -f 2 -d $'\t' file > cols

Crie um diretório para colunas

> mkdir c

Divida todos os dados por colunas (ignore os erros)

> while read i ; do grep "$i" file | cut -f 1,3 -d $'\t' > "c/$i" ; done < cols

Junte todos os dados e exclua repetições

> cut -f 1 -d $'\t' file.sort > result
> for f in c/* ; do join result "$f" > tmp ; join -v 1 result "$f" | sed -e 's/$/ -/g' >> tmp ; sort tmp > result ; done
> uniq result
    
por 07.02.2016 / 23:38