2021년 8월 11일 수요일

[R] ANI dataframe을 뒤집으면 매트릭스가 되지만...

흥미로운 산수 하나.

> class(ani)
[1] "data.frame"
> class(t(ani))
[1] "matrix"
> class((ani + t(ani))/2)
[1] "data.frame"

숫자로만 구성된 데이터프레임을 t() 함수로 뒤집으면 매트릭스가 된다. 그러나 이것을 원본과 더하여 평균을 내면 데이터프레임이 된다. 

이런 해괴한 연산이 왜 필요한가? ANI matrix를 다룰 때, 그 값이 대각선에 대하여 대칭이 되도록 만들기 위해서이다. 대각선이 전부 '1'이면 컬럼과 로(row; '로우'라고 쓰고 싶은 유혹이...)의 라벨은 동일한 순서임을 직관적으로 알 수 있다. 그러나 실제 값은 대각선에 대하여 대칭이 아닐 수도 있다. query와 subject를 어떻게 두느냐에 따라서 blast 혹은 nucmer의 값이 약간 다르게 나올 수 있으니 말이다. 따라서 평균치를 구하는 것이 안전하다. 이렇게 만든 데이터프레임의 실제 값은 대각선에 대하여 대칭을 이룬다.

데이터 m이 매트릭스임에도 불구하고 특정 row를 반환하기 위해 m["A"]를 입력하는 실수를 저지른다. 중고생 시절에는 영문법이 싫었는데 나이가 들어서는 R문법 익히기가 여간 어려운 것이 아니다. 마치 율법학자가 된 느낌이랄까...

댓글 없음: