해당 포스트에서는 R 데이터 프레임(Data Frame)에서 인덱스를 이용해 최대값을 가지는 컬럼명 추출 방법을 소개합니다.
1. INTRO
R에서 가장 많이 사용하는 자료구조인 데이터 프레임(Data Frame)은 행과 열로 이루어진 2차원 자료구조 입니다. 이번 포스트에서는 특정 행의 최대값 인덱스를 찾고 최대값을 가지는 열이름(컬럼명)을 출력해 보도록 하겠습니다.
2. 문제 풀이
데이터 생성
먼저 설명에 사용할 데이터셋을 생성해 보겠습니다.
mydata <- data.frame(x1 = c(1,6),
x2 = c(3,2),
x3 = c(5,1),
x4 = c(4,7),
x5 = c(2,3))
mydata
x1 x2 x3 x4 x5 1 1 3 5 4 2 2 6 2 1 7 3
위에서 생성한 데이터셋(mydata
)는 2개의 행과 5개의 열을 가지는 데이터로 각 열에는 숫자 벡터가 들어있는 것을 볼 수 있습니다.
특정행 최대값 위치 및 컬럼명 찾기
데이터 프레임에서 특정 행 또는 열을 선택하는 방법은 대괄호([ ]
) 안에 콤마(,
)를 사용하여 선택할 수 있습니다. 예를 들어, mydata[1,]
은 1행의 데이터들을 의미하고 mydata[,1]
은 1열의 데이터들을 의미합니다.
아래 예시 코드와 함께 추가 설명드리겠습니다.
1행 데이터 선택
먼저 1행의 데이터를 선택해 보겠습니다.
mydata[1,]
x1 x2 x3 x4 x5 1 1 3 5 4 2
출력 결과를 보면 컬럼명과 1행의 데이터들이 함께 출력된 것을 볼 수 있이며, 눈으로 확인했을 때 최대값은 3번째 컬럼(x3
)에 있는 5인 것을 알 수 있습니다. 눈으로 확인한 최대값의 위치를 코드로 확인하려면 어떻게 해야 할까요?
R에서는 최대값의 위치(인덱스 번호)를 찾아주는 which.max()
함수를 이용하면 쉽게 찾아낼 수 있습니다.
최대값 위치(인덱스) 출력
which.max(mydata[1,])
x3 3
출력 결과를 보면 최대값을 가지는 열이름(컬럼명) x3
과 인덱스 번호 3
을 확인할 수 있습니다. 여기서 컬럼명만 뽑고 싶다면 변수의 이름을 출력해주는 names()
함수를 사용하고, 인덱스 번호만 뽑고 싶다면 as.vector()
함수를 사용하시면 됩니다.
컬럼명 추출
names(which.max(mydata[1,]))
[1] "x3"
인덱스 번호 추출
as.vector(which.max(mydata[1,]))
[1] 3
그럼 최대값이 얼마인지 보려면 어떻게 해야 할까요? 간단하게는 max(mydata[1,])
함수를 이용할 수 있겠지만, 인덱스 번호를 설명하고 있으니 해당 방법으로 풀어보면 아래와 같습니다.
최대값 찾기 : max()
max(mydata[1,])
[1] 5
최대값 찾기 : which.max()
mydata[1,which.max(mydata[1,])]
[1] 5
위 코드가 복잡해 보이지만 구조적으로는 mydata[1,]
로 1행을 선택하고 which.max(mydata[1,])
로 열번호를 선택하였다고 보시면 됩니다.
데이터 분석을 하다보면 경우에 따라 특정 함수를 사용하지 못하는 경우가 발생하는데 그런 경우를 위해 동일한 문제를 다양한 방법으로 풀이해 보는 연습을 해두시는게 좋습니다. (보통 문제해결 역량은 경험에서 나오는 경우가 많습니다. ^^)
만약 1행이 아닌 다른 행의 최대값, 인덱스 번호, 컬럼명을 찾고 싶다면 대괄호의 첫번째 숫자를 변경해 주면 됩니다. 아래는 위에서 확인한 방법들을 2행에 적용한 예시입니다.
최대값 컬럼명
names(which.max(mydata[2,]))
[1] "x4"
최대값 인덱스 번호
as.vector(which.max(mydata[2,]))
[1] 4
최대값 출력
mydata[2,which.max(mydata[2,])]
[1] 7
3. 마무리
이번 포스트에서는 R에서 많이 사용되는 자료구조인 데이터 프레임(Data Frame)에서 최대값의 인덱스 번호, 컬럼명을 찾는 법을 설명하였습니다. 실무에서는 데이터 분석을 수행하다보면 특정 함수의 사용이 제한되거나 특정 함수만 사용해야 하는 경우가 종종 발생합니다. 동일한 문제를 다양한 방법으로 풀이하는 연습을 해두시면 노력은 경험이되어 능숙한 플레이어가 되실 수 있으실 겁니다.