R) 전처리 - pivot-01

R) 전처리 - pivot-01

데이터 전처리 중 데이터 구조를 바꾸는 것은 참 어렵다. 피벗(pivot), 피보팅(pivoting)이라는 단어가 있긴 하지만 좀 더 광의로 접근하자면 데이터 재구조화에 가깝다. 반복문, apply() 함수는 물론이고 reshape2 패키지도 사용하지 않은 날것의 코드로 해결한 경험을 공유한다.

문제 상황

왼쪽 형태의 데이터를 오른쪽 데이터로 바꿔야 한다. 이는 상대적으로 변수가 많은 옆으로 긴(wide form) 데이터 형식을 세로가 긴(long form) 형태로 바꿔주는 것과 같다. 선형대수에서는 보통 wide form 을 fat matrix, long form 을 tall matrix 로 부르니 참고하도록 하자.
문제상황

문제 해결

이 문제는 rep() 함수가 핵심이며, 보다 간결한 코드 작성을 위해 colSums() 함수와 unlist() 함수가 필요하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
df = data.frame(지역 = c("서울", "부산"),
남자 = c(5, 3),
여자 = c(3, 2))
df_new = data.frame(성별 = rep(colnames(df)[-1], times = colSums(df[, -1])),
지역 = rep(rep(df[, 1], ncol(df) - 1), times = unlist(df[, -1])))
df_new
## 성별 지역
## 1 남자 서울
## 2 남자 서울
## 3 남자 서울
## 4 남자 서울
## 5 남자 서울
## 6 남자 부산
## 7 남자 부산
## 8 남자 부산
## 9 여자 서울
## 10 여자 서울
## 11 여자 서울
## 12 여자 부산
## 13 여자 부산

해설

함수 설명

풀이에 사용한 함수를 설명하도록 하겠다.

  • rep(): 입력된 1차원 벡터 또는 그 벡터의 원소를 복제하는 함수
    • x: 1차원 벡터 입력을 권장하나, list 객체도 가능
    • times: rep() 함수의 기본 인자이며 x를 객체 단위로 복제
    • each: x를 원소 단위로 복제
    • length: x를 객체 단위로 복제하나 원소의 길이를 지정하여 맞춤
    • length.out: length와 동일
  • colSums(): column별 합을 계산하며 apply(), sapply() 로 대체할 수 있다.
  • unlist(): list 객체구조를 분해할 때 사용. 데이터프레임도 list의 특수한 형태라 사용 가능

참고로 변수명을 한글로 지정 하는 것은 인코딩 문제 때문에 절대 권장하지 않는다.

사용자 정의 함수

특히 전처리의 경우 해당 코드를 사용자 정의 함수로 만드는 것은 향후 관련 작업의 반복에 매우 도움이 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
df_pivot = function(df){
df_result = data.frame(x = rep(colnames(df)[-1], times = colSums(df[, -1])),
y = rep(rep(df[, 1], ncol(df) - 1), times = unlist(df[, -1])))
return(df_result)
}

df_pivot(df = data.frame(지역 = c("서울", "부산"),
남자 = c(1, 3),
여자 = c(2, 4)))
## x y
## 1 남자 서울
## 2 남자 부산
## 3 남자 부산
## 4 남자 부산
## 5 여자 서울
## 6 여자 서울
## 7 여자 부산
## 8 여자 부산
## 9 여자 부산
## 10 여자 부산

기타

본 문제를 다른 방법으로 접근하고 풀이하신 하헌철님의 소스 코드는 여기에서 볼 수 있다.

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×