HOWTO · R
R의 한 열에서 NA가 있는 행 제거
이 자습서는 R의 데이터 프레임에서 한 열의 NA가 있는 행을 제거하는 방법을 보여줍니다.
이 페이지의 내용
선택한 한 열에 NA가 있는 행을 제거하려면 is.na()가 FALSE인 행만 유지하면 됩니다. 데이터 프레임 df에서 열 이름이 score라면 base R 표현식 df[!is.na(df$score), ]를 사용하세요. 여기서 NA는 R의 결측값 표시이며, 문자 그대로의 텍스트 "NA"를 뜻하지 않습니다. 조건은 score만 확인하므로 다른 열의 결측값은 유지할 행에 영향을 주지 않습니다.
R에서 is.na()를 사용해 한 열에 NA가 있는 행 제거
is.na()는 각 요소가 결측값인지 나타내는 논리값을 반환하며, 결측값은 TRUE로 표시됩니다. 이 결과를 부정한 뒤 행 인덱스로 사용하면 결측값이 아닌 항목을 선택합니다. 예제는 결과를 kept에 저장하므로 원래 df도 그대로 사용할 수 있습니다. 출력에는 유지된 행 수와 ID, 점수가 표시됩니다.
df <- data.frame(id = c(1, 2, 3), score = c(10, NA, 30))
kept <- df[!is.na(df$score), ]
cat("Rows retained:", nrow(kept), "\n")
cat("IDs:", paste(kept$id, collapse = ", "), "\n")
cat("Scores:", paste(kept$score, collapse = ", "), "\n")
score를 사용할 열 이름으로 바꾸세요. 일반적인 형태는 df[!is.na(df$column), ]입니다. 이 표현식은 필터링된 데이터 프레임을 반환하며, 결과를 kept에 저장하면 원래 형태의 df를 계속 사용할 수 있습니다. 핵심은 행 인덱스입니다. 선택한 열에 논리 조건을 적용하고, 조건에 맞는 행을 데이터 프레임 전체에서 유지합니다.
R에서 complete.cases()를 사용해 한 열에 NA가 있는 행 제거
complete.cases()는 입력한 값이 완전한지 각 행마다 논리값을 반환합니다. 열 하나만 전달하면 그 열만 확인합니다. 예를 들어 df[complete.cases(df$score), ]를 사용합니다. 데이터 프레임 전체를 전달하면 모든 열을 확인하므로 score 이외의 열에 결측값이 있어도 행이 제거될 수 있습니다. 다른 열이 행 유지 여부에 영향을 주지 않아야 한다면 한 열만 전달하세요. 이 방식으로 선택되는 행은 is.na() 패턴과 같습니다. 이 함수는 base R에 포함되어 있어 별도 패키지가 필요하지 않습니다.
R에서 drop_na()를 사용해 한 열에 NA가 있는 행 제거
drop_na() 함수는 tidyr 패키지에 포함되어 있습니다. tidyr::drop_na(df, score)처럼 열을 지정하면 score에 값이 있는 행을 유지하고, 확인 범위도 해당 열로 제한합니다. tidyr가 설치되어 있지 않다면 install.packages("tidyr")로 설치하세요. 이 호출은 필터링된 데이터 프레임을 반환하므로 결과를 보관해 재사용하려면 이름을 지정해 할당하면 됩니다. 열 인수를 생략한 drop_na(df)는 모든 열을 확인합니다. 다른 열이 행 유지 여부를 결정하지 않게 하려면 대상 열을 지정하세요.
R에서 na.omit()를 사용해 한 열에 NA가 있는 행 제거
전체 데이터 프레임에 na.omit(df)를 적용하면 어느 열이든 NA가 있는 행은 제거됩니다. 따라서 이 동작은 특정 열만 기준으로 필터링하는 것보다 범위가 넓습니다. !is.na(df$score)로 행을 먼저 선택한 뒤 na.omit()을 적용해도 다른 열에 결측값이 있으면 행이 추가로 제거될 수 있습니다. 이 작업에는 df[!is.na(df$score), ]를 바로 사용하세요. score만 기준으로 행을 유지합니다. 데이터 프레임 어디에든 결측값이 있는 행을 제거하려는 경우에는 na.omit()이 유용합니다.
R에서 subset()을 사용해 한 열에 NA가 있는 행 제거
subset()은 읽기 쉬운 base R 대안입니다. subset(df, !is.na(score))처럼 사용하세요. 조건은 데이터 프레임의 열을 기준으로 평가되므로 score는 df의 열을 가리키며, 다른 열은 조건에 포함되지 않습니다. 반환되는 데이터 프레임에는 조건을 만족하는 행이 들어 있습니다. 결과를 재사용하면서 원래 df를 유지하려면 kept <- subset(df, !is.na(score))처럼 할당하세요. 대괄호를 사용한 표현식과 마찬가지로 조건에 적은 열 이름이 선택할 행을 결정합니다.
R에서 filter()를 사용해 한 열에 NA가 있는 행 제거
dplyr의 filter() 함수는 조건에 따라 행을 선택합니다. dplyr::filter(df, !is.na(score))라고 호출하면 score에 조건을 적용합니다. 패키지가 설치되어 있지 않다면 install.packages("dplyr")로 설치하세요. 이 호출은 데이터 프레임을 반환하며 df를 덮어쓰지 않습니다. 필터링한 데이터를 나중에 사용하려면 결과를 할당하세요. 조건에 score만 지정했으므로 다른 열의 결측값은 이 호출에서 유지할 행을 결정하지 않습니다.
결론
선택한 한 열을 기준으로 삼을 때 df[!is.na(df$column), ]은 간단한 base R 해결책이며, complete.cases(df$column)도 비슷한 논리 마스크를 제공합니다. 이미 해당 패키지를 사용하는 작업 흐름이라면 tidyr::drop_na() 또는 dplyr::filter()를 선택할 수 있습니다. na.omit(df)는 전체 데이터 프레임에 적용할 때 확인 대상 열 이외의 NA 때문에 행을 제거할 수 있으니 주의하세요. 특정 열만 행 유지 여부를 결정해야 한다면 그 열만 검사하는 조건을 사용하세요.