그룹별 합계를 tapply(x, g, sum, na.rm = TRUE)로 냈더니 한 그룹이 0으로 나왔다. 그 그룹의 값은 전부 NA다. 측정값이 하나도 없는데 표에는 합계가 0이라고 적혀 있다.
x <- c(NA_real_, NA_real_)
sum(x, na.rm = TRUE)
#> [1] 0
mean(x, na.rm = TRUE)
#> [1] NaN
max(x, na.rm = TRUE)
#> [1] -Inf
# plus a warning about no non-missing arguments
하나씩 보면 다 변명할 수 있는 답이다. 빈 합은 0이고 빈 평균은 0/0이다. 그런데 요약표에 나란히 놓으면 아무것도 없었다는 말을 세 가지로 하는 셈이고, 그걸 굳이 알려 주는 건 max뿐이다. 그중 0이 제일 나쁘다. 측정값처럼 보이기 때문이다.
앞으로 내 스크립트에 들어갈 버전은 더할 것이 없으면 NA를 돌려준다.
sum_or_na <- function(x) {
if (all(is.na(x))) NA_real_ else sum(x, na.rm = TRUE)
}
나는 NA 쪽이 좋다. 적어도 표를 읽는 사람이 그 그룹에 데이터가 없었다는 걸 볼 수 있다.