корреляции по столбцам AWK - PullRequest
0 голосов
/ 21 ноября 2018

Мне нужно рассчитать корреляции по столбцам.
Приведенный ниже код работает при расчете корреляций по строкам.
Что необходимо изменить для расчета по столбцам?

Input file:  
Name C1 C2 C3 C4 C5 C6
R1   1 2 3 4 5 6
R2   2 1 1 0 1 0
R3   1 3 1 1 2 1
R4   1 1 0 2 0 1
R5   1 2 2 2 0 2
R6   1 1 0 1 2 0

Desired Output:  
C1 C1 1.00
C1 C2 -0.4
C1 C3 -0.069
C1 C4 -0.597
C1 C5 -0.175
C1 C5 -0.362
C2 C2 1.00
C2 C3 0.4889
etc.  


Code:  
 awk '{
  a = 0; for (i = 2; i <= NF; ++i) a += $i; a /= NF-1
  b = 0; for (i = 2; i <= NF; ++i) b += ($i - a) ^ 2; b = sqrt(b)
  if (b <= 0) next
  for (i = 2; i <= NF; ++i) x[NR, i] = ($i - a) / b
  n[NR] = $1
  for (i = 2; i <= NR; ++i) {
    if (!(i in n)) continue
    a = 0
    for (k = 2; k <= NF; ++k)
      a += x[NR, k] * x[i, k]
    print n[NR], n[i], a
  }}'

1 Ответ

0 голосов
/ 21 ноября 2018

Не знаю, ищите ли вы такое решение, но как насчет транспонирования сначала с помощью следующего awk:

awk '
{ for (i=1;i<=NF;i++) arr[i","NR]=$i; }
END {
  for (i=1;i<=NF;i++) {
    for (j=1;j<=NR;j++) printf("%s%s",arr[i","j],FS);
    printf("%s",RS);
  }
}
'

Вывод:

Name R1 R2 R3 R4 R5 R6
C1 1 2 1 1 1 1
C2 2 1 3 1 2 1
C3 3 1 1 0 2 0
C4 4 0 1 2 2 1
C5 5 1 2 0 0 2
C6 6 0 1 1 2 0

Затем просто объедините с вашим скриптомдля вычисления корреляции столбец-столбец:

awk '
{ for (i=1;i<=NF;i++) arr[i","NR]=$i; }
END {
  for (i=1;i<=NF;i++) {
    for (j=1;j<=NR;j++) printf("%s%s",arr[i","j],FS);
    printf("%s",RS);
  }
}
' roddy.txt | awk '{
a = 0; for (i = 2; i <= NF; ++i) a += $i; a /= NF-1
b = 0; for (i = 2; i <= NF; ++i) b += ($i - a) ^ 2; b = sqrt(b)
if (b <= 0) next
for (i = 2; i <= NF; ++i) x[NR, i] = ($i - a) / b
n[NR] = $1
for (i = 2; i <= NR; ++i) {
  if (!(i in n)) continue
  a = 0
  for (k = 2; k <= NF; ++k)
    a += x[NR, k] * x[i, k]
  print n[NR], n[i], a
}}'

Вывод:

C1 C1 1
C2 C1 -0.4
C2 C2 1
C3 C1 -0.069843
C3 C2 0.488901
C3 C3 1
C4 C1 -0.597614
C4 C2 0.239046
C4 C3 0.667827
C4 C4 1
C5 C1 -0.175412
C5 C2 0.30697
C5 C3 0.581936
C5 C4 0.576557
C5 C5 1
C6 C1 -0.362738
C6 C2 0.362738
C6 C3 0.861381
C6 C4 0.932143
C6 C5 0.731727
C6 C6 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...