본문 바로가기

배우기/복습노트[R과 분석]

[복습] R(programming language) 적용함수(sapply) + 하루 끝(20231129)

728x90
반응형

적용함수란 apply계열 함수를 의미하며, 데이터를 적절히 함수와 어울리게 fetch하여 함수에 적용하고 결과 리턴을 도와주는 함수이다. 적용함수의 원리는 분리, 적용, 결합이다(데이터 분리(fetch) → 함수에 적용 → 적용 결과 결합). 이 세 가지 원리에 의해 순서대로 이루어진다.

1차원 객체에 대한 적용: sapply, lapply, mapply(sapply를 압도적으로 많이 사용)

2차원 객체에 대한 적용: apply

그룹별 적용: tapply(그룹핑 할 수 있음)

앞으로 배우게 될 내용은, lapply는 사실상 쓰지 않고, sapply, mapply, apply를 주로 배울 예정이다.

 

오늘은 sapply에 대하여 공부하였다.

 

1.sapply

sapply(list, function)

sapply(list,            # 1차원 대상

            function,    # 적용 함수

              .......)        # 가변형 인수 전달 방식, 위의 function이 추가적인 인수를 요구할 경우 이 곳에 나열함.

 

예를 들어 아래 벡터에서 각 원소의 , 를 삭제하여보자. 단 str_remove_all 함수가 각 원소별 반복이 불가하다는 가정을 두겠다.

v1 <- c('1,100', '2,000', '3,000')

 

sapply(v1, str_remove_all()) 이렇게는 사용하지 못한다. v1이라는 대상이 이미 앞에 나와있다. 따라서 아래와 같이 쓰면 된다.

sapply(v1, str_remove_all, ',')

 

 

위와 같은 맥락으로 하나의 문자열을 입력받고 분리구분기호를 입력받은 뒤 분리되는 n번째 값을 리턴하여보자.

 

하지만 f_split(pro$EMAIL , '@', 1) 하면 에러가 난다. 왜냐하면 여기서 만든 사용자 지정 함수인 f_split이 벡터를 허용하지 않기 때문이다. 그래서 sapply를 쓰는 것이다.

 

 

 

728x90

 

 

연습문제로 쭉 풀어보면서 연습을 하였다.

연습문제 1. emp에서 각 부서의 이름을 출력하여라(부서번호를 입력하면 부서명이 출력되는 함수), 10번은 인사부, 20번은 총무부, 30번은 재무부

 

 

 

 

연습문제 2. exam_01.csv 파일을 읽고 학번을 입력하면 해당 학번 학생의 학점이 리턴되는 함수를 생성하여라. 모든 학생에 대한 학점을 출력하며, 학점 부여 기준은 아래와 같다.

0-70: C, 71-85: B, 86-100: A

 

 

 

연습문제 3. 퇴직금 계산 함수(emp.csv)

사번을 입력하면 퇴직금이 출력되도록 하여라(퇴직금 = 근속연수 * 급여 * 0.1)

 

내 풀이와 선생님 풀이 중 연도 계산 방법이 조금 달라서 둘 다 기록.

먼저 내 풀이이다.

나는 lubricate 패키지를 사용하여 연도만 추출해서 둘의 차를 계산하였다.

 

선생님 해설은 아래와 같다.

윤년 포함/미포함 차이로 결과 값이 달라진 것 같다.

 

여기서 주의해야 할 점이 있다.

Line 2에서, 그리고 3에서 emp$EMPNO가 있는데 input value도 emp$EMPNO이다. 그렇게 되면 그냥 전체를 비교하게 되는 것이다. emp$EMPNO == emp$EMPNO. 따라서 전부 TRUE가 나온다. 정상처럼 출력되기는 하나 잘못된 접근이다.

 

 

Line 9 - 12까지 잘 비교하여보자.

 

따라서 위와 같이 코드를 작성하는 게 좋다. (틀린 필기임. 곧 수정예정)

 

 

연습문제 4. 위와 같은 퇴직금을 계산하는 함수를 행성하여라. 대신 input value는 입사일과 급여이다.

단, 근속연수가 40년 이상일 경우는 급여의 10%, 미만일 경우는 9% 증가한다.

 

먼저 function은 위와 같이 작성할 수 있으나 지금까지 배운 내용에 적용해보면 에러가 난다.

sapply(emp$HIREDATE, emp$SAL, f_ret) 하기에는 emp$SAL이 function으로 인식되고,

sapply(emp$HIREDATE, f_ret, emp$SAL)로 하면 이상한 값이 리턴된다. R에서 이상한 값이 나왔다면 굳이 해석하려 해서는 안된다. R은 정답이 아닌 경우 가끔 이상한 값을 내뱉는 경우가 많다. 차라리 에러가 나면 좋은데 말이다.

 

이때 사용하는 것이 mapply 이다.

 

다음시간에 배울 내용이지만 간단히 살펴보면, mapply는 여러 벡터에 대한 동시 fetch가 가능하며,

mapply(function, ........) 의 형태로 작성한다.

 

 

 

 

R의 첫 번째 고비는 반복문, 두 번째는 apply 계열 함수라고 한다.

오늘은 나머지들을 배우겠지......?

정신 바짝 차려야겠다.

728x90
반응형