HOWTO · R
R에서 요인을 숫자 값으로 변환하기
R 요인을 숫자 레이블로 안전하게 변환하고, 요인 코드와 값을 구분하며, 잘못된 레이블을 처리하는 방법을 알아봅니다.
이 페이지의 내용
요인 f에 숫자 레이블이 들어 있고 그 레이블을 숫자로 가져와야 한다면 as.numeric(as.character(f))를 사용합니다. as.numeric(f)를 직접 호출하면 요인의 내부 정수 코드가 반환됩니다. 직접 변환은 해당 코드를 범주 ID로 의도적으로 사용할 때만 적합합니다.
요인에 as.numeric을 적용했을 때 반환되는 값 이해하기
R 요인은 정수 코드와 별도의 문자 레벨 집합을 함께 저장합니다. 코드는 정렬된 순서나 명시적으로 지정된 순서에 따라 레벨을 가리키며, 원래 측정값 자체가 아닙니다. levels()와 unclass()로 두 부분을 모두 확인할 수 있습니다.
as.numeric(f)의 출력은 2 1 2 3과 같은 코드 시퀀스입니다. 원래 값이 2, 1, 2, 3이었다는 뜻이 아닙니다. 데이터 프레임이 숫자처럼 보이는 열을 요인으로 가져온 경우 이 차이가 중요합니다.
숫자처럼 보이는 요인 레이블을 숫자로 변환하기
먼저 요인을 문자로 변환한 다음 레이블을 숫자 값으로 변환합니다.
f <- factor(c("3", "2", "3", "4"))
values <- as.numeric(as.character(f))
values
레벨이 숫자라는 사실을 알고 있는 요인에는 as.numeric(levels(f))[f]도 효율적인 방법입니다. 두 방법 모두 내부 코드가 아니라 레이블을 복원합니다. 문자를 먼저 거치는 방식은 일반적으로 읽기 쉽고 두 번의 변환을 명확히 보여 줍니다.
소수와 음수로 된 숫자 레이블도 같은 방식으로 처리됩니다. 가져오기나 데이터 정리 단계 가까이에서 변환하고, 계산에 사용하기 전에 str() 또는 class()로 결과를 확인하세요.
범주 레이블을 의도적으로 인코딩하기
레이블이 범주라면 해당 코드를 측정값처럼 다루지 마세요. 안정적인 ID가 필요할 때는 범주의 순서를 명시적으로 설정합니다.
grade <- factor(c("low", "high", "low"), levels = c("low", "high"))
codes <- as.numeric(grade)
codes
여기서 1과 2는 순서를 명시적으로 선택했기 때문에 생긴 범주 코드입니다. high가 low의 두 배라는 뜻은 아닙니다. 업무나 모델에 맞는 매핑에는 이름이 지정된 조회 벡터가 더 명확합니다.
grade <- c("low", "high", "low")
score <- c(low = 10, high = 20)[grade]
score
이 방식은 각 숫자 값의 의미를 눈에 보이게 유지하고 기본 요인 레벨 순서에 의존하지 않게 합니다.
숫자가 아닌 레이블, 결측값 및 경고 처리하기
문자를 거치는 변환도 임의의 레이블을 숫자로 바꿀 수는 없습니다. 숫자가 아닌 텍스트는 NA가 되고 R은 형 변환 경고를 출력하며, 이미 결측값인 값은 그대로 유지됩니다.
f <- factor(c("12.5", "oops", NA))
values <- as.numeric(as.character(f))
values
is.na(values)
예상하지 못한 NA 값은 데이터 품질 문제를 알리는 신호로 다루세요. 원래 레이블을 확인하고, 필요하면 공백을 제거하거나 정규화하며, 분석 전에 잘못된 레코드를 처리할 방법을 결정해야 합니다. 이를 조용히 0으로 바꾸지 마세요. 레이블이 숫자가 아니라 범주라면 명시적인 매핑이나 순서를 명시한 요인을 사용합니다.
변환 결과 확인하기
결과를 사용하기 전에 원본 클래스, 레벨, 변환된 값, 경고를 확인하세요. 핵심 규칙은 다음과 같습니다.
- 의도적인 요인 코드에는
as.numeric(f)를 사용합니다. - 숫자 레이블에는
as.numeric(as.character(f))를 사용합니다. - 범주에는 명시적인 순서나 이름이 지정된 매핑을 사용합니다.
- 가져온 텍스트를 변환한 뒤에는
NA값을 확인합니다.
최신 R 코드에서는 문자열이 요인으로 변환되는지에 관한 과거 기본값에 의존하지 말고 가져오기 형식이나 요인 레벨을 의도적으로 지정해야 합니다. 이러한 확인 과정을 거치면 각 숫자 결과의 의도된 의미가 분명해집니다.