본문 바로가기

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

[복습] R(programming language) 적용함수(sapply, lapply, mapply, apply) (2) + 하루끝(20231130)

728x90
반응형

적용함수란 R에서의 apply 계열함수이다.

데이터의 일부를 fetch하여 함수에 적용하고, 적용 결과를 결합하여 리턴한다.

(분리-적용-결합의 메커니즘을 가짐)

 

1. sapply

하나의 벡터의 원소에 함수를 적용한다(for문 없이 벡터의 원소를 하나씩 fetch하여 함수에 전달, 즉 하나의 벡터의 원소별 적용).

주로 벡터를 리턴한다(때에 따라 list나 matrix로 리턴되기는 함. split 쓰는 경우 등)

 

문법

sapply(list,         # 1차원 객체

           function,  # 적용 함수

           .....)          # 함수에 추가 전달할 인수 필요시

예시이다. f1(c(11, 1))에서 에러가 나는 이유는 벡터를 허용하지 않기 때문이다. 벡터와 어울리지 않는 구문(if문)이 함수 안에 있다.

 

 

2. lapply

sapply와 기능이 같다. 하나의 벡터의 원소에 함수를 적용한다(for문 없이 벡터의 원소를 하나씩 fetch하여 함수에 전달, 즉 하나의 벡터의 원소별 적용).

주로 list를 리턴한다. 리턴되는 형식이 input과 output 관계에 따라 자료를 적절히 선택하게 되는데 그때마다 고려하게 된다. 간혹 matrix를 출력하고자 한다면 matrix도 출력이 가능하다.

문법

lapply(list, function, ....)

lapply(c(11,1), f1) 이런 식으로 작성하면 된다.

 

 

3. mapply

1차원 객체에 대하여 원소별로 적용한다.

그리고 여러 객체에 대하여 동시 fetch를 도와주는 적용함수이다.

주로 벡터로 리턴된다.

문법

mapply(function,             # 함수

               ... )                    # 함수에 필요한 인수 나열(함수에 전달하는 인수 나열)

예시는 위와 같다. 

 

 

연습문제 두 개를 풀어보자.

연습문제 1. 학번을 입력하면 학생의 학점을 출력되도록 하여라. 학점 기준은 hakjum.csv 참고

 

 

연습문제 2. professor 테이블에서 position과 deptno를 입력하면 같은 직급과 같은 학과의 교수 수를 출력하여라.

 

 

 

 

4. apply

apply는 2차원에 적용하며, 행별, 열별, 원소별로 각각 적용할 수 있다. 벡터, 행렬로 리턴된다(key 구조로는 리턴하지 못한다).

문법

apply(array,             #적용대상

         margin,           #fetch 방향(행방향: 1, 열방향: 2) 행별로 fetch 하겠다면 1, 열별로 fetch 하겠다면 2

                                   그리고 원소별로 fetch 하겠다고 하면 c(1,2)

            .....)              # 적용 함수 및 추가 인수

 

apply(data, 1, func1) 인 경우 func1에 벡터로 input, 

apply(data, 2, func1) 인 경우 func1에 벡터로 input

즉 func1 함수는 벡터가 허용되는 문법이 들어가야 한다.

apply(data, c(1,2), func1) func1에 스칼라로  input.

따라서 func1함수는 스칼라가 허용되는 문법이어야 한다.

 

예를 들어 matrix 하나를 생성 하고 행별 열별로 총 합을 구해보자

우선 matrix를 생성하기 위해서는 다음과 같이 입력하면 된다.

matrix(1:20, nrow=4, ncol=5)

nrow와 ncol 중 하나만 써도 나머지 한 쪽은 자동 결정된다.

key-value 구조가 아니므로 한 행을 엑세스 할 수 있는 위치를 알려준다(노란 표시).

 

Line 3 은 행별 sum 결과이고, Line 5는 열별 sum 결과이다.

 

NA는 무시하고 합을 계산하여 보자.

 

 

이번엔 원소별로 적용하여보자

card_history.csv 파일을 읽고 지출 품목별 총 합을 구하여라

 

 

위의 계산에서 card <- apply(card, c(1, 2), f1) 의 c(1,2) 부분에 그냥 1 또는 2를 써도 에러는 없다. 그러나 행과 열의 방향이 바뀌는 현상이 발생할 수는 있다. R에서는 문제가 없으나 가급적 c(1,2)를 권하는 이유는 파이썬에서는 되지 않기 때문이다. 파이썬은 원소 하나씩 넣어야 한다. 벡터가 들어갈 수 없다. 

card <- apply(card, 1, f1) 해도 문제는 없다. 그러나 행렬이 대치되는 현상이 발생한다. 컬럼 우선 순위이기 때문이다.

선생님이 그려주신 그림이긴 한데...ㅎ 위처럼 행의 결과가 첫 번째 컬럼으로 가기 때문이다.

정상이긴 하나 행과 열이 전치되어 출력된다(matrix가 컬럼 우선순위 배치이기 때문).

card <- apply(card, 2, f1)은 문제가 없다.

 

 

728x90

 

 

연습문제들을 풀어보겠다.

다음의 데이터 프레임에서 각각 ';'로 분리한 두 번째 값만을 출력하여라(데이터프레임으로 출력)

 

 

이번엔 apply2_test.csv 파일을 읽고 지점별(a, b, c, d) 매출 총 합을 출력하여라

 

 

 

emp 데이터 프레임에 dname 컬럼을 추가하여 각 부서이름을 저장하여라. 부서이름은 dept정보를 활용한다.

 

 

 

emp 데이터 프레임에 MAX_SAL 컬럼을 추가하여 부서별 최대 급여를 저장하여라

 

 

5. tapply

문법

tapply(vector,            # 연산대상(1차원)

            index,            # 그룹핑 컬럼(1차원)

            function)        # 연산함수

 

예시로 바로 설명하겠다.

emp에서 부서별 최대 급여를 출력하려면 바로 이렇게 구하면 된다.

 

그러면 부서별 최대 급여자는 다음과 같다.

 

 

 

 

와 다음날 수업 직전에 복습 다 끝냈다...

안밀렸다 다행이다..........

728x90
반응형