의학 논문을 쓸 때 테이블을 만드는 게 큰 일입니다. 주요 테이블들을 완성하면 사실 논문이 반쯤 써진 것이나 마찬가지이죠. 통계 분석을 하고 거기서 나온 숫자를 일일히 테이블에 손으로 옮겨 적는 일은 참 사람 지치게 하는 일입니다. 게다가, 일껏 테이블을 만들었는데 연구 대상 집단을 일부 빼고 또는 좀 더해서 다시 통계를 돌리게 되면 그 지루한 작업을 다시 반복해야 하는 일이 벌어지죠. 잘못 옮겨 적는 일도 비일비재하구요. 그래서 통계 패키지에서 바로 테이블을 만들어 줄 수 있으면 정말 환상적인데… 문제는 통계 패키지가 내 필요에 딱 맞는 테이블을 그렇게 출력해주지 않는다는 거죠.
그런데 R을 사용하게 되면서 이 막강한 유연성을 이용하여 거의 못할 것이 없게 되었습니다. (물론 삽질은 필수!) 의학 학술지에서는 흔히 표가 맨 첫 행은 아래 위 경계선이 있고 맨 아래 선이 있고 좌우나 중간에는 선이 없는 모양입니다. 그런 모양의 테이블을 만들어 주는 R function 입니다. 기존에도 publication-quality table을 그려주는 R package들이 많이 있는데 Latex 를 이용한 것들이 많은 것 같더군요. 이것은 HTML 을 이용한 표입니다. 브라우저에서 띄운 후 워드로 복사해 붙이면 됩니다. 테이블의 내용은 matrix 로 만들어주면 되는데 이건 테이블 내용에 따라 천차만별이라 일률적으로 이걸 수행하는 함수를 만들진 못했구요, 일단 매트릭스가 완성이 되면 그담엔 이 함수에 집어 넣으면 바로 표가 만들어집니다. R 과 HTML 을 다 어느 정도 아시면 코드를 이해하는 데 어려움은 없을 것입니다.
## x = matrix containing table content, y = file name for table write.html.table <- function(x, y){ sink(file=y) n.col.table <- ncol(x) n.row.table <- nrow(x) cat( "<html>\n", "<head>\n", "<style type=\"text/css\">\n", "table tr { height: 40px; cellspacing=\"0\"; cellpadding=\"30\"; border-collapse:\"collapse\"; }\n", "table tr.first td { border-top: 2px solid black; border-bottom: 1px solid black; }\n", "table tr.last td { border-bottom: 2px solid black; }\n", "</style>\n", "</head>\n", "<body>\n" ) # 첫줄은 아래 위 경계선 있음. 마지막 줄은 아래 경계선 있음, 나머지는 경계선 없음 cat("<table width=\"100%\">\n") for (i in 1:n.row.table) { row.style <- ifelse (i == 1, "<tr class=\"first\">", ifelse(i == n.row.table, "<tr class=\"last\">", "<tr>")) cat(row.style) for (j in 1:n.col.table) { cat("<td>", x[i,j]) } cat("</tr>\n") } cat("</table>\n") cat("</body>\n</html>") sink() }
결과물의 예를 하나 첨부합니다. Reference: S.Y. Choi, J. Sung, H.E. Park, et al., Combined effects of exercise capacity and coronary atherosclerotic burden on all-cause mortality in asymptomatic Koreans, Atherosclerosis 251 (2016) 396-403.