Como posso combinar informações de três arquivos para criar um quarto?

1

Eu tenho três arquivos csv, cada um deles contendo as informações necessárias para obter um quarto. Estou descrevendo arquivos de brinquedo, mas os reais contêm muito mais colunas e linhas, ainda nos mesmos modelos.

O arquivo 1 é o arquivo de dados brutos. Uma letra é dada para cada 'rs' em 'Individual'. Por exemplo. Individual0 tem um 'A' em rs009, um 'T' em rs888, etc. :

        Individual0 Individual1 Individual2 Individual3
rs009   A       T       A       A
rs888   T       T       T       T
rs103   C       C       C       C
rs591   A       A       A       A
rs112   A       A       A       A
rs004   C       C       C       C

O arquivo 2 agrupa as variáveis 'rs' em 'Grupos'. Cada um desses "Grupos" é uma combinação de variáveis 'rs' sucessivas, de acordo com a ordem no Arquivo 1. Por exemplo, rs009 e rs103 são agrupados em uma variável denominada "Grupo0". Não há possibilidade de ter um 'Grupo' Isso se sobreporia a outro.Quando "Group0" termina, "Group1" é iniciado, e assim por diante.É importante que algumas variáveis 'rs' sejam filtradas nesta etapa (ou seja, rs888):

Group0 rs009 rs103
Group1 rs591 rs112 rs004

O arquivo 3 é o arquivo de resultado no qual cada variável 'Grupo' recebe um número atribuído para cada "indivíduo". Por exemplo, o indivíduo2 tem um 3 no grupo 0 e um 2 no grupo 1:

        Individual0 Individual1 Individual2 Individual3
Group0  1       3       3       3
Group1  3       3       2       3

O arquivo que eu gostaria de obter é semelhante ao Arquivo 1, mas no qual todas as variáveis 'rs' que não estivessem em um 'Grupo' = 3 para um determinado 'Individual' no Arquivo 3 seriam definidas como 0, enquanto os outros manteriam sua carta. Por exemplo, rs009 pertence ao Group0 (cf Arquivo 2), então o Arquivo 3 informa que o Group0 para Individual0 tem um '1', significando que a letra mencionada no Arquivo 1 deve ser alterada para 0. Ao contrário, para Individual1, O arquivo 3 informa que o Group0 tem um '3', portanto a letra no arquivo 1 deve ser mantida (ou seja, 'T'). As variáveis 'rs' que foram filtradas receberão o mesmo número que a anterior na lista (ou seja, rs888 tem a mesma atribuição 'Group' que rs009):

        Individual0 Individual1 Individual2 Individual3
rs009   0       T       A       A
rs888   0       T       T       T
rs103   0       C       C       C
rs591   A       A       0       A
rs112   A       A       0       A
rs004   C       C       0       C

Em outras palavras, preciso:

1) pegue o arquivo 1

2) verifique em qual 'Grupo' cada 'rs' pertence ao Arquivo 2. Se um 'rs' não estiver no Arquivo2, então ele pertence ao mesmo 'Grupo' que o 'rs' anterior, de acordo com o ordem no Arquivo1.

3) obtenha o valor atribuído para cada "Grupo" em cada "Individual" no Arquivo 3

4) se o último valor for '3', então mantenha a letra (A / C / G / T) atribuída para cada "indivíduo" no Arquivo 1, caso contrário mude para '0'

Eu tentei várias opções com awk, mas meu conhecimento é bastante limitado, então eu não poderia descobrir o caminho para conseguir o que eu preciso no final. É meu primeiro post, então espero que informações suficientes sejam fornecidas. Eu posso executar Perl scritps, mas não escrevê-lo, estou com medo. Agradecemos antecipadamente por sua ajuda!

    
por nbrucato 24.05.2015 / 20:41

1 resposta

0

Bem, isso é um hack, mas de qualquer forma:

Vamos usar file3 e file2 e resolver os grupos para um arquivo intermediário resolved com algo como:

awk '
    FNR == NR {
        group = $1
        $1 = ""
        groups[group] = $0
    }
    FNR != NR {
        for (i = 2; i <= NF; i++) {
            print $i" "groups[$1]
        }
    }
' <(tail -n+2 file3) file2 > resolved

para:

$ cat resolved
rs009  1 3 3 3
rs103  1 3 3 3
rs591  3 3 2 3
rs112  3 3 2 3
rs004  3 3 2 3

e, em seguida, use resolved para combiná-lo com file1 com:

awk '
    FNR == NR {
        group = $1;
        for (i = 2; i <= NF; i++) {
            groups[group][i] = $i
        }
    }
    FNR != NR {
        if ($1 in groups) {
            group = $1
        }
        for (i = 2; i <= NF; i++) {
            if (groups[group][i] != 3) {
                $i = 0
            }
        }
        print
    }

' resolved <(tail -n+2 file1)

que produz:

rs009 0 T A A
rs888 0 T T T
rs103 0 C C C
rs591 A A 0 A
rs112 A A 0 A
rs004 C C 0 C

Utilizando column e adicionando o cabeçalho de volta e estamos bem.

    
por 27.05.2015 / 09:32

Tags