약간 불규칙적인 것을 처리 하기 위해서는 우리는 함수를 만든다. 함수를 만드는 목적은 for loop문 같이 반복적으로 연산 할때 매우 유리하게 사용 된다. 아래는 네이버 지식인에서 아래와 같이 질문한 내용을 정리 한 것이다.
데이터 숫자 분류 |
질문의 내용은 아래와 같다.
R을 공부하고 있는데, 궁금한점이 있습니다
예를들어 아래와 같은 표가 있을때. 상품코드가 200번이나 201번일때 분류코드는 4자리가 되어야합니다. 따라서 분류코드가 3자리 인경우 앞에 0을 붙여 네자리로 만들고(분류코드가 이미 네자리일 경우는 데이터 변경x), 상품코드가 490이나 491일 경우에는 분류코드가 7자리가 되어야 해서 앞에 7자리가 되게끔 자리수에 맞게 0을 붙여야 합니다.
문제 해결
함수를 2개를 만든다. 200번대 4자리를 만드는 함수, 그리고 상품코드 400번대 7자리수를 만드는 사용자 함수를 만든 다음 아래와 같이 for loop 문으로 정리 하였다.
# 라이브러리 불러오기
library(dplyr)
상품명 <- c("A", "B", "C", "D", "E")
상품코드 <- c(200, 201, 200, 490, 491)
분류코드 <- c(222, 230, 1234, 3974, 12345)
df <- data.frame(상품명, 상품코드, 분류코드)
df
## 상품명 상품코드 분류코드
## 1 A 200 222
## 2 B 201 230
## 3 C 200 1234
## 4 D 490 3974
## 5 E 491 12345
# 함수 만들기 상품코드 세자리 100~999 일 경우 가정
four_digit <- function(x, y) {
z <- paste0(ifelse(nchar(y) == 3,"0",""), y)
return(z)
}
# 함수 만들기 400번호 대 7자리수 만들기
seven_digit <- function(x, y){
diff = nchar(y)
z = paste0(
ifelse(diff == 3, "0000",
ifelse(diff ==4, "000",
ifelse(diff == 5, "00",
ifelse(diff == 6 , "0","00000")))),
y)
return(z)
}
# 루프문을 돌려가며 자리수 조정 하기
for(i in 1:nrow(df)){
x <- df$상품코드[i]
y <- df$분류코드[i]
if( x >= 100 & x < 400 ){
df$분류코드[i] <- four_digit(x,y)
} else if(x >= 400 & x < 500){
df$분류코드[i] <- seven_digit(x,y)
}
}
df
## 상품명 상품코드 분류코드
## 1 A 200 0222
## 2 B 201 0230
## 3 C 200 1234
## 4 D 490 0003974
## 5 E 491 0012345
nchar 함수를 이용하여, 글자 수를 계산 하여, 자릿수에 모자르면, ifelse 함수를 이용해서 비교적 간단하게 작성 한 것이다.
실무에서 이런 취합이 매우 많으니, 앞에와 같은 사용자 함수를 만들어서, 루프문을 돌릴때 재사용 하는 것은 매우 좋다.
댓글 없음:
댓글 쓰기