Перевернуть два столбца только при определенных условиях (для мета-анализа) - PullRequest
0 голосов
/ 07 октября 2019

Чтобы выполнить метаанализ между когортами, мне нужно, чтобы все аллели были закодированы одинаково.

Для этого выполните следующие шаги:

  • Для каждого SNP определите, совпадают ли аллели (т. Е. A1 одинаково в обеих когортах, A2одинаково в обеих когортах).
  • Если аллели совпадают, ничего не делать
  • Если аллели для SNP не совпадают (т.е. они переворачиваются), переверните аллели и поменяйте знак эффекта. размер (столбец BETA)
  • Если аллели для SNP различны, удалите SNP

Когорта 1 (cohort1.txt)

SNP     CHR     A1      A2      BP      P       BETA 
SNP1    1       C       T       74648   0.224   0.32 
SNP2    4       A       T       82193   0.345   0.04 
SNP3    5       T       C       34223   0.234   -0.12
SNP4    6       AA      G       31871   0.241   0.043

Cohort 2 (cohort2.txt)

SNP     CHR     BP      A1      A2      BETA    P
SNP1    1       74648   C       T       0.32    0.224
SNP2    4       82193   A       T       0.04    0.345
SNP3    5       34223   C       T       -0.12   0.234
SNP4    6       31871   A       G       0.13   0.003

Вывод «перевернутый» для когорты 2 будет:

SNP     CHR     BP      A1      A2      BETA    P
SNP1    1       74648   C       T       0.32    0.224
SNP2    4       82193   A       T       0.04    0.345
SNP3    5       34223   T       C       0.12    0.234

Чтобы получить список не перевернутых SNP, я бы использовал:

awk 'NR==FNR{_[$3]=$4} NR!=FNR{if($4==_[$5]) print;}' cohort2.txt cohort1.txt

Затем, чтобы перевернуть аллели в когорте 2, я бы использовал:

awk ' { t = $4; $4 = $5; $5 = t; print; } ' cohort2.txt

И, наконец, изменил знак эффекта-размера:

awk '{$6=$6*a;print}' a=-1 cohort2.txt

Однако я не могу понять, как это сделать, только если исходное условие (совпадение аллелей) неверно.

Ответы [ 2 ]

2 голосов
/ 07 октября 2019

еще awk, при условии, что А1 и А2 имеют одинаковую длину (здесь 1 символ)

$ awk -v OFS='\t' 'NR==FNR {a[$1]=$3$4; next} 
                   $1 in a {if(a[$1]==$4$5) print; 
                            else if(a[$1]==$5$4) 
                                    {$6=-$6; t=$4;$4=$5;$5=t; print}}' file1 file2 

SNP     CHR     BP      A1      A2      BETA    P
SNP1    1       74648   C       T       0.32    0.224
SNP2    4       82193   A       T       0.04    0.345
SNP3    5       34223   T       C       0.12    0.234
2 голосов
/ 07 октября 2019

1-е решение: Не могли бы вы попробовать следующее, протестировано только с предоставленными образцами. Это сравнивает SNP по их номерам строк, позвольте мне добавить один, который работает без номера строки также в течение нескольких минут.

awk '
FNR==NR{
  a2_1[FNR]=$3
  a2_2[FNR]=$4
  next
}
(a2_1[FNR]==$4 && a2_2[FNR]==$5){
  print
  next
}
(a2_1[FNR]==$5 && a2_2[FNR]==$4){
  tmp=$4
  $4=$5
  $5=tmp
  $(NF-1)*=-1
  print
  next
}
(a2_1[FNR]!=$4 && a2_2[FNR]!=$5){
  next
}'  Input_file1  Input_file2 | column -t

Вывод будет следующим:

SNP   CHR  BP     A1  A2  BETA  P
SNP1  1    74648  C   T   0.32  0.224
SNP2  4    82193  A   T   0.04  0.345
SNP3  5    34223  T   C   0.12  0.234


2-е решение: Это не ограничено номером строки, $ 1 (SNP) может прийти в любое место в Input_file, и он будет искать его в Input_file.

awk '
FNR==NR{
  a2_1[$1,"A1"]=$3
  a2_2[$1,"A2"]=$4
  next
}
(a2_1[$1,"A1"]==$4 && a2_2[$1,"A2"]==$5){
  print
  next
}
(a2_1[$1,"A1"]==$5 && a2_2[$1,"A2"]==$4){
  tmp=$4
  $4=$5
  $5=tmp
  $(NF-1)*=-1
  print
  next
}
(a2_1[$1,"A1"]!=$4 && a2_2[$1,"A2"]!=$5){
  next
}
' Input_file1  Input_file2 | column -t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...