0Pricing
R Academy · 강의

계산과 집계에서의 NA

mean(), sum() 및 기타 집계 함수에서 NA 처리 방식을 제어합니다.

계산과 집계에서의 NA은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 R Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

na.rm 매개변수

대부분의 R 집계 함수는 na.rm 인수를 받습니다(NA 제거). TRUE로 설정하면 함수가 결과를 계산하기 전에 NA 값을 무시합니다. 기본값은 na.rm = FALSE이므로 NA가 전파됩니다.

scores <- c(88, NA, 72, 95, NA, 81, 67)
cat('With na.rm=FALSE (default):
')
cat('  mean:', mean(scores), '
')           # NA
cat('  sum: ', sum(scores), '
')            # NA
cat('With na.rm=TRUE:
')
cat('  mean:', mean(scores, na.rm = TRUE), '
')  # 80.6
cat('  sum: ', sum(scores, na.rm = TRUE), '
')   # 403

na.rm을 사용한 mean()

mean(x, na.rm = TRUE)는 결측이 아닌 값의 산술 평균을 계산합니다. 분모는 전체 길이가 아니라 존재하는 값의 개수입니다.

temperatures <- c(22.1, NA, 19.8, 25.1, NA, 17.3, 20.0)

cat('Total elements:', length(temperatures), '
')
cat('Present elements:', sum(!is.na(temperatures)), '
')
cat('Mean (na.rm=TRUE):', mean(temperatures, na.rm = TRUE), '
')

# Manual verification
cat('Manual mean:', sum(temperatures, na.rm=TRUE) / sum(!is.na(temperatures)), '
')

na.rm을 사용한 sum()

sum(x, na.rm = TRUE)는 NA가 아닌 값만 더합니다. NA가 포함될 수 있는 논리 벡터에서 TRUE의 개수를 세거나, 불완전한 데이터에서 합계를 계산할 때 필수적입니다.

sales_daily <- c(1200, NA, 980, 1450, NA, 1100, 890)
cat('Sum (default):', sum(sales_daily), '
')            # NA
cat('Sum (na.rm):  ', sum(sales_daily, na.rm = TRUE), '
')  # 5620

# Count observations meeting a condition (NA-safe)
cat('Days over 1000:', sum(sales_daily > 1000, na.rm = TRUE), '
')

na.rm을 사용한 min() 및 max()

min()과 max()에도 na.rm 매개변수가 있습니다. 이 매개변수를 사용하지 않으면 입력에 NA가 하나만 있어도 함수가 NA를 반환합니다. na.rm = TRUE로 설정하면 존재하는 값 중 최솟값 또는 최댓값을 반환합니다.

blood_pressure <- c(120, NA, 135, 118, NA, 142, 125, NA, 130)
cat('Max BP (default):', max(blood_pressure), '
')              # NA
cat('Max BP (na.rm):  ', max(blood_pressure, na.rm = TRUE), '
')  # 142
cat('Min BP (na.rm):  ', min(blood_pressure, na.rm = TRUE), '
')  # 118
cat('Range (na.rm):   ', range(blood_pressure, na.rm = TRUE), '
')

na.rm을 사용한 var() 및 sd()

분산(var())과 표준 편차(sd())도 na.rm을 지원합니다. 결측이 아닌 관측값만 사용해 통계량을 계산하고, 자유도도 자동으로 조정합니다.

exam_scores <- c(78, 85, NA, 92, 68, 75, NA, 88, 91, NA)
n_valid <- sum(!is.na(exam_scores))
cat('Valid observations:', n_valid, '
')
cat('Mean:   ', round(mean(exam_scores, na.rm = TRUE), 2), '
')
cat('SD:     ', round(sd(exam_scores, na.rm = TRUE), 2), '
')
cat('Var:    ', round(var(exam_scores, na.rm = TRUE), 2), '
')

na.rm을 사용한 median() 및 quantile()

median()과 quantile()은 평균보다 이상값에 더 강건한 경우가 많지만, 결측값을 올바르게 처리하려면 역시 na.rm = TRUE가 필요합니다.

incomes <- c(45000, NA, 52000, 48000, NA, 210000, 51000, NA, 49000)
cat('Observations:', sum(!is.na(incomes)), '
')
cat('Median income:', median(incomes, na.rm = TRUE), '
')
cat('Mean income:  ', mean(incomes, na.rm = TRUE), '
')  # pulled up by 210000
cat('25th pctile:  ', quantile(incomes, 0.25, na.rm = TRUE), '
')
cat('75th pctile:  ', quantile(incomes, 0.75, na.rm = TRUE), '
')

na.rm을 사용한 prod() 및 cumsum()

prod(x, na.rm = TRUE)는 NA가 아닌 값의 곱을 계산합니다. cumsum()과 같은 누적 함수에는 na.rm이 없습니다. 따라서 첫 번째 결측값부터 이후의 모든 결과에 NA가 전파됩니다.

growth_rates <- c(1.05, NA, 1.03, 1.08, NA, 1.02)
cat('Product of rates:', prod(growth_rates, na.rm = TRUE), '
')

# cumsum propagates NAs
values <- c(10, 20, NA, 40, 50)
cat('cumsum (with NA):', cumsum(values), '
')

# Workaround: replace NA first
filled <- replace(values, is.na(values), 0)
cat('cumsum (NA=0):   ', cumsum(filled), '
')

apply 함수에서 na.rm 사용하기

행렬의 행이나 열에 apply()를 사용할 때는 ...을 통해 함수에 na.rm = TRUE를 전달할 수 있습니다. 그러면 NA를 무시하고 집계값을 계산합니다.

m <- matrix(c(88,NA,72, 95,81,NA, 67,75,90), nrow = 3)
cat('Matrix:
'); print(m)

# Row means ignoring NAs
cat('Row means (na.rm=TRUE):', apply(m, 1, mean, na.rm = TRUE), '
')

# Col means ignoring NAs
cat('Col means (na.rm=TRUE):', apply(m, 2, mean, na.rm = TRUE), '
')

na.rm을 사용한 rowSums() / colSums()

rowSums()와 colSums()에는 고유한 na.rm 매개변수가 있으며, ...을 통해 전달하지 않습니다. na.rm = TRUE를 사용하면 합계를 계산할 때 NA를 0으로 처리합니다.

sales <- matrix(c(100,NA,80, NA,90,70, 110,85,NA), nrow = 3)
cat('Sales matrix:
'); print(sales)

cat('Row sums (na.rm=F):', rowSums(sales), '
')             # NAs propagate
cat('Row sums (na.rm=T):', rowSums(sales, na.rm = TRUE), '
')
cat('Col means (na.rm=T):', colMeans(sales, na.rm = TRUE), '
')

비교: na.rm=FALSE와 TRUE

na.rm = TRUE와 FALSE 중 언제 무엇을 사용할지는 분석 목적에 따라 결정됩니다. FALSE를 사용하면 데이터가 불완전하다는 사실을 확인할 수 있고, TRUE를 사용하면 사용 가능한 데이터로 최선의 추정 통계를 계산합니다.

# Always check: how much data is missing BEFORE using na.rm=TRUE
collected <- c(78, NA, 85, NA, 91, 74, NA, 88, 82, NA)
pct_missing <- mean(is.na(collected)) * 100
cat('Missing:', round(pct_missing, 1), '% of data
')

if (pct_missing < 20) {
  cat('Acceptable: computing mean with na.rm=TRUE
')
  cat('Mean:', round(mean(collected, na.rm = TRUE), 2), '
')
} else {
  cat('Too much missing data — investigate before computing
')
}

사용자 함수에서의 na.rm

직접 집계 함수를 작성할 때는 na.rm 매개변수를 포함하고, 이 값을 R의 기본 함수에 전달하십시오. 이렇게 하면 작성한 함수가 R의 관례와 일관되게 동작합니다.

# Custom function with na.rm support
cv <- function(x, na.rm = FALSE) {
  # Coefficient of Variation = SD / mean
  s <- sd(x, na.rm = na.rm)
  m <- mean(x, na.rm = na.rm)
  return(s / m)
}

readings <- c(22.1, NA, 19.8, 25.1, NA, 17.3, 20.0)
cat('CV (na.rm=FALSE):', cv(readings), '
')          # NA
cat('CV (na.rm=TRUE): ', round(cv(readings, na.rm = TRUE), 4), '
')

빠른 확인

mean(c(10, 20, NA, 40), na.rm = TRUE)는 무엇을 반환합니까?

복습: 계산에서의 NA

훌륭합니다! 이번 레슨의 핵심 내용은 다음과 같습니다.

  • 대부분의 집계 함수(mean, sum, min, max, sd 등)에는 na.rm 매개변수가 있습니다.
  • na.rm = FALSE(기본값)는 NA가 전파된다는 의미입니다. 값 중 하나라도 NA이면 결과도 NA입니다.
  • na.rm = TRUE는 NA를 무시하고 현재 존재하는 값만으로 통계를 계산합니다.
  • mean(na.rm=TRUE)의 분모는 전체 길이가 아니라 NA가 아닌 값의 개수입니다.
  • na.rm=TRUE로 통계를 계산하기 전에 결측 데이터의 비율을 항상 확인하십시오.
  • R의 관례를 따르려면 직접 작성하는 집계 함수에도 na.rm을 포함하십시오.
# Complete summary with na.rm
data_vec <- c(55, NA, 72, 88, NA, 61, 79, NA, 93, 68)
cat('N valid:', sum(!is.na(data_vec)), '
')
cat('Mean:  ', round(mean(data_vec, na.rm=TRUE), 2), '
')
cat('Median:', median(data_vec, na.rm=TRUE), '
')
cat('SD:    ', round(sd(data_vec, na.rm=TRUE), 2), '
')
cat('Min:   ', min(data_vec, na.rm=TRUE), '
')
cat('Max:   ', max(data_vec, na.rm=TRUE), '
')

자주 묻는 질문

“계산과 집계에서의 NA” 강의는 무료인가요?

네 — “계산과 집계에서의 NA” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“계산과 집계에서의 NA”에서 뭘 배우나요?

mean(), sum() 및 기타 집계 함수에서 NA 처리 방식을 제어합니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

R Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“계산과 집계에서의 NA” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. R에서 NA 이해하기
  2. 결측값 감지 및 개수 세기
  3. NA 값 제거 및 대체
  4. 계산과 집계에서의 NA
← R Academy(으)로 돌아가기