2021년 9월 30일 목요일

SLR의 펜타미러 정렬 틀어짐에 관해 검색을 해 보다

지난 일요일, 올림푸스 DSLR E-620 뷰파인더의 문제점에 대하여 글을 쓴 일이 있다(링크).  뷰파인더 상에서 피사체를 정중앙에 놓고 사진을 찍었지만 실제로 찍힌 이미지에서는 오른쪽 아래로 심하게 치우치는 현상을 카메라 구입 11년째에 확인했다는 내용이었다.

국외 사이트에서 나와 같은 문제에 대한 질문과 답을 찾았다. 

[DPREVIEW] Viewfinde lost its accuracy.. please help.

...Sounds like the viewfinder pentamirror is out of alignment.

카메라 제조사의 서비스 센터에 가서 조정을 받으라는 것이 답변이었다. 그렇군! 왜 그런 생각을 못했을까? 부품을 교체할 필요는 없을 것이다. 오래 전에 단종이 된 모델이라서 수리를 위한 부품이 있을 것 같지도 않다.

그러나 만약에 조정을 할 수 있는 여지가 없다면? 예를 들어 나사를 돌려서 각도를 조절할 수 있는 것이 아니라 펜타미러 어셈블리가 접안부에 완전히 접착된 상태라면? 별로 생각하고 싶지 않는 상황이다.

올림푸스 카메라의 국내 A/S는 2026년 3월 말에 완전히 종료된다. 서비스점은 용산 한 곳밖에 남지 않았다. 완전히 문을 닫기 전에 가 봐야 되겠다.

2021년 9월 27일 월요일

캐논 EOS 5는 살아나기 어려울 것 같다

EOS 5D가 아니라 1992년 11월 출시된 EOS 5 이야기이다. 135 포맷의 필름을 넣어 사용하는, 구식 SLR 카메라 말이다. 뷰파인더 내에 세로로 배치된 5개의 포커싱 표식 중 원하는 곳을 눈으로 바라보면 알아서 초점을 맞추어 주던 기능이 당시에는 정말 놀라웠었다.

EOS 5 QD + EF 28-105 mm 1:3.5-4.5 USM 렌즈
이 카메라를 마지막으로 쓴 것이 언제인지는 잘 기억이 나지 않는다. 1993년에 종로에서 구입을 하여 나의 주력 카메라가 되었고, 2006년 미국 출장길에서도 열심히 쓴 것이 아마도 마지막 활용 기억인 것 같다. 그 후로는 조금씩 디지털 카메라에서 휴대폰으로 사진 촬영용 도구구의 취향이 바뀌면서 장식장 안에서 고이 잠을 자고 있었다.

필름을 넣고 사진을 찍지 않는다 해도 가끔 셔터를 눌러 보든지 하면서 동작을 시켜 보았다면 훨씬 더 좋은 상태로 보존이 되었을 것이다. 배터리(2CR5)를 일부러 사기도 귀찮아서 그냥 방치한 채로 벌써 몇년이 흘렀을까. 어제는 6V 어댑터에 악어 클립을 연결하여 전원을 넣어 보았다. 오디오 앰프를 만드느라 납땜질을 꽤 하는 편이니 이런 수준의 연결 작업은 일도 아니다. 상부 액정창에 표시는 뜨는데 배터리가 부족하다는 경고가 나타난다. 멀티미터로 찍어 보니 전압은 잘 나오는데 왜 그럴까? 전류량이 부족한가? 요즘은 구하기 어려운 신품 2CR5 배터리를 구입하여 넣으면 과연 렌즈가 '삐리릿' 소리와 함께 힘차게 돌아가면서 '철커덕'하면서 셔터가 작동할 것인가? 혹은 배터리 값만 날리는 일이 되려나?

렌즈를 분리하니 거울면이 뿌옇다. 오랜 시간이 지나면서 먼지가 많이 묻었으리라. 전원 연결 시험에 실패했으니 본체와 렌즈의 작동상태를 전부 알 수 없는 상황이다. 차라리 적당한 가격의 중고 DSLR 바디만을 구입하여 소장 중인 몇 개의 EF 렌즈 꽂아 활용하는 것이 나을 수도 있다. 그러나 곧바로 풀프레임이냐 혹은 크롭 센서(APS-C) 바디냐의 선택 문제에 직면하게 된다. 만약 크롭 센서 바디라면, 광각과 표준을 아우를 EF-S 렌즈를 추가적으로 구입해야 한다. 차라리 초기 세대의 EOS 5D 바디를...?

이래도 돈, 저래도 돈이 든다.

두물머리의 풍경. 올림푸스 E-620으로 촬영.


2021년 9월 26일 일요일

올림푸스 E-620 광학 파인더 시야(율)의 문제 - 왜 한쪽으로 치우쳐서 찍히는가? (뷰파인더 쏠림 현상의 뒤늦은 발견)

올림푸스 DSLR E-620의 광학 파인더 시야율은 약 95%라고 한다. 고급형 카메라에서는 100%에 가까운 시야율을 제공하는 것이 일반적이다. 최근 여행길에 이 카메라를 이용하여 사진을 찍으면서 분명히 피사체를 화면 정가운데에 놓고 촬영을 했음에도 불구하고 결과물에서는 한쪽으로 몰리는 경향이 있음을 발견하였다. 2010년 11월에 구입하여 이 카메라를 열심히 사용하던 당시에는 그저 부족한 시야율 문제라고 생각했던 것 같다. 시야율이 아무리 낮아도 정중앙 영역이 잘 유지되면 괜찮을 것이다. 그러나 한편으로 치우친다면 여간 심각한 문제가 아니다. 사용자 매뉴얼을 놓고 화면에 거의 차게 맞춘 다음 촬영한 결과를 보자. 렌즈는 표준 줌인 Zuiko Digital 14-42 mm 1:3.5-5.6 ED을 사용하였다.

42 mm에서 촬영.

14 mm에서 촬영. 광각렌즈 특유의 왜곡('barrel distortion')이 선명하다.  

뷰파인더에서 분명히 큐브를 정가운데 놓고 촬영을 하였다. 그러나 실제로 찍힌 이미지에서 큐브는 어디에 위치하고 있는가?

이게 뭐람! 최소한 중앙은 맞추어 줘야 하는 것이 아닌가? 보이는 그대로 찍는다는 (D)SLR의 장점이 무색해지는 순간이다. 렌즈를 망원계 줌으로 바꾸어도 결과는 마찬가지이다. 물론 미러를 들어올리고 라이브 뷰 촬영을 하면 이런 문제는 생기지 않는다. 설계의 문제인가, 제조 공정상의 문제인가? 카메라를 떨어뜨려서 펜타미러가 뒤틀린다 해도 이런 일은 벌어지지 않으리라.

만약 충분한 여유를 두지 않고 화면을 꽉 차게 구성을 한다면 오른쪽 아래 구석이 이미지 경계선에 바싹 붙어서 매우 어색한 사진이 될 것임이 자명하다. 그렇다면 매번 촬영 후에 이미지 편집 프로그램에서 크로핑을 해야 된단 말인가? 아니면 뷰파인더에 프레임이 표시되거나 보정되지 않는 레인지파인더 카메라를 쓰는 기분으로 촬영을 해야 하는 것인지... 화면을 구성한 다음 카메라를 살짝 움직여서 찍어야 하는가?

카메라 구입 후 11년째에 재확인한 문제점이라니! 비슷한 문제점에 대한 글을 구글 검색에서 찾기가 어렵다. 올림푸스 E-620 고유의 제조 결함이라면 사용자 커뮤니티에서 난리가 났을 것이다. 운 나쁘게 내 카메라만 그렇다고 봐야 할 것이다. 이 정도의 문제라면 제조 후 검수 과정에서 걸려졌어야 할 터인데 당시에는 시야율이 적어서 그런 줄로만 알았지 중앙에서 이렇게 한참 떨어진 곳을 뷰파인더가 겨냥할 것이라고는 생각도 하지 못했다.


2021년 9월 23일 목요일

2021년 9월에 올림푸스 DSLR E-620을 쓴다는 것은...

디지털 카메라의 시장이 해가 갈수록 쭈그러들고 있다는 것은 누구나 다 아는 사실이다. 레트로 감성에 필름 카메라와 바이닐(LP)이 잠시 인기를 얻고 있지만 산업의 흐름을 바꿀 정도는 되지 못하는 것으로 안다.

스마트폰이 일반인을 위한 카메라 수요를 흡수하면서 소위 전문가용 카메라로 불리던 DSLR은 아예 판형을 풀프레임(과거 필름의 크기와 같은 36 x 24mm)으로 키우거나 혹은 동일한 센서 크기를 갖는 미러리스로 체제를 바꾸어서 진지한 아마추어 계층을 흡수하고 있다. 그래도 과거 필름 DSLR의 전성기에 비교할 바는 아니다. 여전히 글로벌 시장에서는 캐논이 가장 큰 비중을 차지하고 있지만, 풀프레임 미러리스라는 새로운 유행을 불러 일으킨 데에는 소니가 크게 기여한 것 같다.

나도 한때는 꽤 진지하게 사진을 찍고 직접 암실 작업(흑백)을 하던 사람이었다. 그런데 그게 벌써 30년 가까운 과거의 일이 되고 말았다. 거실 장식장에는 이제 작동 상태를 신뢰할 수 없는 카메라 본체와 렌즈가 꽤 많이 잠을 자고 있다. 나 역시 뒷주머니에 꽂고 다니던 휴대폰을 꺼내어 사진을 찍고, 특별한 후처리 없이 구글 포토에 그냥 자동 업로드하는 사진 생활에 익숙해졌기 때문이다.

나의 첫 DSRL은 올림푸스의 E-620이다(PRREWIEW에 실린 정보 링크). 2010년 11월 초에 두 개의 줌렌즈를 포함한 키트를 할인 행사 가격에 구입하여 한동안 잘 사용하였으나, 만 4년째가 되면서 IS(image stabilization) 기능에 문제가 생기면서 점점 쓰지 않게 되었다(관련 글 링크). 그런 일이 벌어진 직후 가족 여행을 위해 펜탁스 Q 10(5-15mm 렌즈킷)을 구입하여 조금 쓰다가 현재와 같이 스마트폰으로만 사진을 찍는 체제로 굳어지게 되었다. E-620은 다른 필름 카메라와 마찬가지로 거실 장식장 속에 갖인 상태로 몇 년을 그대로 지내고 있었다. 

어떤 일이 갑작스런 계기가 되었는지는 잘 기억이 나지 않는다. 이번 추석 연휴를 보내면서 문득 (D)SLR의 감성이 그리워지기 시작했다. 터치 스크린이 아니라 손으로 직접 하드웨어 버튼(또는 다이얼)을 조작하고, 아이 레벨 뷰파인더에 직접 눈을 대고 피사체를 바라보며 셔터 릴리즈 버튼을 누르는 경험을 다시 해 보고 싶었다. 배터리를 충천하여 실로 오랜만에 카메라를 조작해 보았다. 확실히 Ansmann의 호환 배터리는 문제가 있었다. 충분한 시간을 충전하였지만 충전기의 표시등이 녹색으로 바뀌는 것이 아니라 적색 상태에서 깜빡거리는 것을 발견하였다. 그러나 정품 배터리는 제대로 작동을 하였다. 넥 스트랩의 중간에 덧댄 미끄럼 방지용 인조 가죽(?)은 부스러지기 시작하였고, USB 단자를 덮는 고무 마개는 케이블을 꽂기 위해 젖히는 순간 탄성이 다 없어져서 툭 부러져 버렸다.

비록 오랜 세월을 견디면서 일부 외장재는 이렇게 부스러지는 상태였으나, 2014년 11월에는 분명히 문제가 있던 E-620가 마치 잠에서 깨어나듯 조금씩 제 기능을 되찾기 시작하였다. 처음에는 작동이 되다 안되다는 반복하는 것으로 여겨졌으나, 그것은 상태가 나빠진 호환 배터리를 충분히 충전하지 못해서 생긴 문제였던 것 같다. 


어댑터를 통해서 헬리오스 수동 렌즈를 끼워 보았다.

올림푸스한국은 2020년 5월, 국내에서 카메라 사업을 완전히 종료함을 밝힌 바 있다. 사후 서비스는 2026년 3월 31일까지 한시적으로 운영된다. 한국 소비자들이 유난히 센서의 크기에 집착하는 것이었을까? 공식적으로는 한국 시장에서 물러나는 것이지만, 올림푸스가 계속 카메라를 생산할지는 알 수가 없다. 마이크로 포서즈 형식의 카메라 및 호환 렌즈는 앞으로 나온다고 해도 해외 직구를 통해 사는 것 말고는 구입할 방법이 없다. 게다가 E-620은 훨씬 전에 버림받은 '포서즈' 형식이 아니겠는가? 올림푸스의 마이크로 포서즈 시스템 바디 모델 번호 체계는 너무나 헷갈리므로 별도의 문서를 참조하는 것이 낫다. OM-D는 E-M# 형태의 바디에 해당하는 것 같다.

다행스럽게도 어제 하루 동안의 출사에서 배터리 문제를 제외하면 E-620은 별 문제가 없이 작동하는 것처럼 보였다. 2014년 늦가을 당시에는 왜 IS 불량 현상이 빚어졌는지 이해할 수 없을 정도였으니 말이다. 하지만 '가전제품'과 다를 바가 없는 DSLR 본체가 앞으로 얼마나 잘 작동할지는 예측하기 어렵다. 만약 E-620 본체가 정말로 수리가 어려울 정도로 망가진다면, 14-42 mm및 40-150 mm의 두 줌렌즈는 어디에 쓴단 말인가? 예비용으로 적절한 마이크로 포서즈 바디와 렌즈 어댑터(MMF-1/2/3)을 구해 두는 것이 옳을까? 아니면 차라리 캐논의 보급형 DSLR 바디를 사서 역시 놀고 있는 EF 렌즈를 끼워서 쓰는 것이 바람직할까?

추석 연휴 마지막 날에 군산에서 올림푸스 E-620으로 찍은 사진 몇 장을 올려 본다. 휴대폰으로 찍은 세로 사진 혹은 좌우로 긴 사진만 보다가 오랜만에 4:3 비유의 이미지를 보니 정말 느낌이 새롭다. 촬영 정보를 살펴보면 해상도는 휴대폰보다 더 낮다. 최대 해상도인 4032 x 3024 픽셀로 촬영해도 구글 포토의 무제한 업로드 기준인 1,600만 화소에 미치지 못한다.




자작 오디오 앰프가 제자리를 잡으면서 여가 시간에는 영화를 보는 것 말고는 별로 할 일이 없게 되었으므로 자연스럽게 다시 사진(장비)에 관심을 갖게 된 것일까? 다음에 관심을 갖게 될 대상은 혹시 자전거는 아닐까? 몇 가지 되지 않는 분야를 빙글빙글 돌아다니는 것만 같다.

IS 기능이 망가진 것은 확실하다. IS 설정을 하면 빨간 경고 표시가 깜빡거린다.



2021년 9월 17일 금요일

박테리아 분류의 새로운 바람

그동안 Bacillus라는 genus는 최신의 잣대로는 별로 관계가 없는 박테리아까지 한데 품어주는 넉넉한 집 역할을 해 왔었다. 작년이었던가, 유전체학 시대에 걸맞는 분석 결과를 근거로 이렇게 많은 식구를 거느리던 바실러스 가족은 새로운 genus로 하나 둘 독립해 나가가기 시작하였다. 가장 큰 집안이었던 Bacillus subtilisBacillus cereus clade는 변화가 없지만, 나머지 것들은 생소한 genus 명을 갖게 된 것이다.

이러한 혁명적(?) 수준의 변화를 가져다 준 2020년의 주요 논문을 직접 찾아서 읽어보는 것이 올바른 자세임에는 틀림이 없다. 그러나 그것이 성가시다면, 중요한 사실을 요약하여 작성한 가벼운 글을 인터넷에서 찾아서 읽는 것도 나쁘지 않을 것이다. 다음의 글은 찰스 리버 연구소에서 근무하는 Christine Farrance라는 사람이 지난 7월에 게재한 글이다.

Reclassification of Bacteria Happens 

이 글이 실린 Eureka: a dose of science라는 웹사이트는 찰스 리버 연구소의 과학 블로그라고 한다. 블로그를 방문해 보면 히스패닉 문화나 흑인 과학자에게 경의를 표하는 등 과학 그 이상의 정신을 담고 있었다. 별 영양가도 없는 유튜브에서 이상한 뉴스, 해괴한 동영상을 보느니 이런 곳에 올라온 자료를 보는 것이 훨씬 나을 것이다.

새롭게 제안된 분류 체계에서 B. velezensisB. siamensis는 어떻게 자리를 잡고 있는지 아직 상세하게 살펴보지는 못하였다. Farrance가 소개한 논문(Patel and Gupta, Int. J. Syst. Evol. Microbiol. 2020;70:406–438 링크)의 그림을 보면 이들은 전부 B. subtilis clade에 속하므로 그 분류학상 위치가 달라지지는 않을 것이다.

Clostridium botulinum도 더하면 더했지 바실러스보다 나은 상황이 아니다. 내가 몇 가지 분석을 해 보았을 때 genus 수준에서 재분류를 해야 함이 명백하다. 그런데 누군가 이를 논문으로 정식으로 제안을 하여 미생물 분류학계에서 인정을 받는다면, 질병관리청과 같이 이 세균을 법률로써 다루어야 하는 공식 기관에서는 많은 어려움을 겪게 된다. 예를 들어서 보툴리눔이 4개의 새로운 종으로 나뉜다고 가정해 보자. 몇 가지 법에서 정의한 고위험성병원체 체계를 이에 맞추어 고쳐야 한다.

대장균(Escherichia coli)는 세균성 이질을 일으키는 Shigella와 유전체학적 기준으로는 다를 바가 없다. 그러나 이를 만약 한 종으로 합쳐 버린다면? 식품에는 허용하는 대장균의 수가 있지만 내가 알기로 이질균은 있어서는 안된다. 그러나 과학적으로 상당한 근거가 있다 하더라도 그 경계를 허물거나 혹은 새롭게 만드는 것의 파급 효과는 상당히 크다. 미생물 분류의 문제가 과학만으로 끝나는 것이 아니라 국민의 안전 및 보건을 다루는 영역까지 건드린다는 것이 엄연한 사실이다.

'아버지를 아버지라 부르지 못하는' 안타까운 일이 미생물 학계에서도 벌어지고 있다. 

EMBOSS "msbar" 명령어는 좀 이상하다

$ wossname msbar
Find programs by keywords in their short description
SEARCH FOR 'MSBAR'
msbar  Mutate a sequence

EMBOSS의 mabar 명령으로 박테리아 유전체 염기서열에 인위적으로 SNP를 도입한 뒤 몇 가지 계산 작업을 하였다. SNP의 수는 10개에서 200까지 총 20 단위로 하였고, 30번씩을 반복하였다. msbar는 도입한 염기 변이의 위치를 별도로 제공하지는 않는다. 

SNP 검출 프로그램을 사용하여 내가 과연 제대로 일을 하고 있는지 궁금하여 각 변이 유전체에 대하여 최종 점검을 해 보았다. 결과는 너무나 이상하였다. msbar를 통하여 도입한 수에 비하여 약 75%에 불과한 숫자가 나오는 것이 아닌가. Sensitivity나 PPV(positive predictive value) 전부 99%를 훨씬 넘는 프로그램을 썼는데 이럴 수는 없다.

T. Seemann의 snp-dists를 사용하여 원본 유전체와 돌연변이 유전체를 직접 비교해 보았다. insertion/deletion은 전혀 없이 염기 치완 돌연변이만 도입하였으므로, 두 파일을 합쳐 놓으면 aligned FASTA 파일과 다를 이유가 없기 때문이었다. 결과는 역시 이상하게 나왔다. 모든 샘플을 다 건드리지는 않았지만 도입한 변이 수의 80%만이 실제로 존재하는 것으로 확인되었다. 이런 결과를 이용할 수는 없다.

CFSAN SNP Pipeline(PeerJ Computer Science 2015년 논문 링크)에서 성능평가용으로 개발한 SNP Mutator 프로그램을 써 보기로 하였다. 설정할 파라미터가 많지만 무엇보다도 돌연변이를 도입한 위치와 염기 정보를 고스란히 제공하기 때문에 결과물을 믿을 수 있다. 이 프로그램으로만든 돌연변이 유전체를 이용하여 필요한 계산을 하고 확인을 위해 SNP를 검출해 보았다. 놀랍게도 도입한 숫자가 거의 그대로 검출되었다. 결국 성능이 의심스러운 돌연변이 도입 프로그램을 쓰는 바람에 일주일을 허비한 셈이 되었다. 하지만 모든 과정을 일괄적으로 실행하는 스크립트와 결과 분석용 R 코드를 그런대로 잘 정비해 두었기에 SNP Mutator로부터 새로 시작하는 것은 그렇게 어렵지 않았다.

SNP Mutator의 중요한 특징은 다음과 같다.

  • Mutations can be any number of single-base substitutions, insertions, and deletions at randomly chosen positions, uniformly distributed across the genome.
  • Mutations can be chosen from a subset (pool) of all possible positions.
  • Replicates can be partitioned into multiple groups with each group sharing a pool of eligible positions.

의심의 눈초리를 거두지 말아야 한다. 언제 어떤 실수를 할지 모르므로.

2021년 9월 14일 화요일

[하루에 한 R] for loop를 이용하여 데이터프레임 생성하기

Column/Row를 구성하는 벡터가 전부 준비된 상태에서 데이터프레임을 만드는 것은 비교적 쉽다. 기존에 존재하는 데이터프레임을 cbind() 함수로 합치는 것도 마찬가지이다. 그런데 합쳐야 할 벡터가 수십 개 이상 된다고 하자. 이를 일일이 타이핑하기는 곤란하다. 반복문을 쓰지 않고서는 매우 어렵다. 

EMBOSS의 msbar 명령을 이용하여 박테리아 유전체 서열에 염기치환돌연변이를 일정하게 도입하였다. 그 각각이 원본 유전체 서열('ancestor'에 해당)에 대하여 얼마나 멀어졌는지를 Mash로 측정해 보았다. 목표로 하는 돌연변이 수에 대하여 msbar는 총 30회를 실시하였고, 돌연변이의 수는 10, 20, 30..200으로 하였다. 결과물은 전부 하나의 파일(dist.tab)에 저장하였다. 

$ head -n 5 dist.tab 
GCF_000008445.1.010.00.c.fnm	GCF_000008445.1.fna	1.61302e-06	0	9999/10000
GCF_000008445.1.010.01.c.fnm	GCF_000008445.1.fna	4.8398e-06	0	9997/10000
GCF_000008445.1.010.02.c.fnm	GCF_000008445.1.fna	0	0	10000/10000
GCF_000008445.1.010.03.c.fnm	GCF_000008445.1.fna	1.61302e-06	0	9999/10000
GCF_000008445.1.010.04.c.fnm	GCF_000008445.1.fna	9.68178e-06	0	9994/10000

첫번째 컬럼이 돌연변이 유전체 FASTA 파일의 이름이다. fna라는 흔한 확장자를 fnm('m' for mutation)으로 고쳤다. 파일명 중간쯤에 '010'이라는 숫자가 바로 돌연변이 수에 해당한다. 만약 10, 20...으로 표기를 했다면, 100을 넘어가는 결과와 함께 다룰 때 sort에 주의해야 한다. 그래서 약간 귀찮지만 이런 파일명을 쓴 것이다. 

하나의 돌연변이 숫자에는 총 30개의 Mash distance(위 자료에서 세번째 컬럼)가 있다. 이것을 뽑아내어 각기 다른 컬럼으로 만들고자 하는 것이 오늘의 목표이다. 돌연변이의 수는 총 10에서 200까지 10 단위로 증가하므로 20개가 되고, 이것이 목표로 하는 데이터프레임의 전체 컬럼 수가 된다. Row의 수는 30개가 된다.

일반적인 슬라이싱을 통해서 원본 데이터프레임의 일부를 잘라낸 뒤 새 데이터프레임에 한 컬럼씩 붙여 넣는 방법이 있을 것이라 생각했는데 잘 되지 않았다. 검색을 거듭한 결과 리스트를 써야 함을 알게 되었다. 참조했던 웹사이트가 어디였는지는 기억을 하지 못하겠다. do.call() 함수를 쓰는 방법을 잘 알아야 될 것이다.

> header = sprintf(seq(10,200,10), fmt='%03d')
> header
 [1] "010" "020" "030" "040" "050" "060" "070" "080" "090" "100" "110" "120"
[13] "130" "140" "150" "160" "170" "180" "190" "200"
> df = read.table("dist.tab", sep="\t", row.names=1) > datalist = list() > for(i in header) { + pattern = paste(".", i, ".", sep="") + datalist[[i]] = df[grepl(pattern, row.names(df)), 2] + } > df.2 = do.call(cbind, datalist) > View(df.2)

최적화된 R code라고 확신을 할 수는 없다. '.010.' 형태의 패턴을 추출할 때, 앞뒤의 점은 정규표현식에서 임의의 문자 하나에 대응하는 점이 아니라 문자 그대로의 '.'임이 중요한데, 이것이 grepl() 함수에서 정확히 인식되고 있는 것인지를 잘 모르겠다. grep()은 인덱스를 반환하지만 grepl()은 TRUE 또는 FALSE를 반환한다고 한다. 어쨌거나 View(df.2)로 확인을 하면 다음과 같이 내가 의도한 데이터 변환이 이루어졌음을 알 수 있다.

나의 '데이터 주무르기'는 그야말로 마음 내키는 대로이다. 모든 조작을 Perl에서 하던 시절도 있었고, 요즘은 bash script와 awk/sed 등을 적절히 섞어서 쓰는 빈도가 늘어났다. 그러다가도 예외 사항이 별로 없이 매트릭스 형태로 잘 짜여진 데이터 파일을 보면 R에서 작업을 하고 싶어진다. 사용했던 코드를 노트 파일과 컴퓨터 작업 공간에 잘 저장해 두는 것도 좋은 버릇이라고 자평한다.