IT기술 관련/빅데이터 관련

[R 프로그래밍] apply, lapply, sapply, tapply, mapply, by

호레 2016. 4. 23. 20:47
반응형

1. apply - 적용한 함수 값을 리스트로 반환 

 

> (성적 <- read.table("성적.txt", header=TRUE)[-1])  # 성적.txt 파일에서 첫 열을 제거.
   국어 수학 영어
1     8    7    2
2     6    5    7
3     9    4    9
4     4    5    7
5     5    8    9
6     5    9    6
7     4    7   10
8    10   10    9
9     7    5    4
10    7    7    5

 

> apply(성적, 1, sum)  # 행 단위의 계산(합계) 값을 벡터로 출력한다.
 [1] 17 18 22 16 22 20 21 29 16 19
> apply(성적, 1, mean) # 행 단위의 계산(평균) 값을 벡터로 출력한다.
 [1] 5.666667 6.000000 7.333333 5.333333 7.333333 6.666667 7.000000 9.666667 5.333333 6.333333
> round(apply(성적, 1, mean),1) # round() 함수로 소수점 1자리까지 반올림.
 [1] 5.7 6.0 7.3 5.3 7.3 6.7 7.0 9.7 5.3 6.3
> apply(성적, 2, sum)  # 열 단위의 계산(합계) 값을 벡터로 출력한다.
국어 수학 영어 
  65   67   68 
> apply(성적, 2, mean) # 열 단위의 계산(평균) 값을 벡터로 출력한다.
국어 수학 영어 
 6.5  6.7  6.8 

 


요약 함수가 아닌 각각의 요소 값에 적용되는 함수의 예제

 

> apply(성적, 1, function(x){x*2})
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
국어   16   12   18    8   10   10    8   20   14    14
수학   14   10    8   10   16   18   14   20   10    14
영어    4   14   18   14   18   12   20   18    8    10



> apply(성적, 2, function(x){x*2})
      국어 수학 영어
 [1,]   16   14    4
 [2,]   12   10   14
 [3,]   18    8   18
 [4,]    8   10   14
 [5,]   10   16   18
 [6,]   10   18   12
 [7,]    8   14   20
 [8,]   20   20   18
 [9,]   14   10    8
[10,]   14   14   10



> 성적 * 2
   국어 수학 영어
1    16   14    4
2    12   10   14
3    18    8   18
4     8   10   14
5    10   16   18
6    10   18   12
7     8   14   20
8    20   20   18
9    14   10    8
10   14   14   10


​> 성적 * function(x){x*2}
Error in FUN(left, right) : non-numeric argument to binary operator


위와 같이 상수가 아닌 경우 직접적인 계산 함수를 적용할 수 없기 때문에 apply() 함수를 사용한다.



2. lapply(list apply) - 적용한 함수 값을 리스트로 반환 

> 성적 <- read.table("성적.txt", header=TRUE) # 성적.txt 파일을 읽어서 성적이라는 변수에 저장한다.
> 성적
   학번 국어 수학 영어
1     1    8    7    2
2     2    6    5    7
3     3    9    4    9
4     4    4    5    7
5     5    5    8    9
6     6    5    9    6
7     7    4    7   10
8     8   10   10    9
9     9    7    5    4
10   10    7    7    5

> 성적 <- 성적[-1] # 성적데이터에서 학번열을 제거한다.
> 성적
   국어 수학 영어
1     8    7    2
2     6    5    7
3     9    4    9
4     4    5    7
5     5    8    9
6     5    9    6
7     4    7   10
8    10   10    9
9     7    5    4
10    7    7    5

> lapply(성적, sum) $국어 [1] 65 $수학 [1] 67 $영어 [1] 68

> lapply(성적, mean) $국어 [1] 6.5 $수학 [1] 6.7 $영어 [1] 6.8 

 

 

 

3. sapply(simple apply) - 적용한 함수 값을 벡터나 행렬로 반환

 

> 성적 <- read.table("성적.txt", header=TRUE) # 성적.txt 파일을 읽어서 성적이라는 변수에 저장한다.
> 성적
   학번 국어 수학 영어
1     1    8    7    2
2     2    6    5    7
3     3    9    4    9
4     4    4    5    7
5     5    5    8    9
6     6    5    9    6
7     7    4    7   10
8     8   10   10    9
9     9    7    5    4
10   10    7    7    5
> 성적 <- 성적[-1] # 성적데이터에서 학번열을 제거한다.
> 성적
   국어 수학 영어
1     8    7    2
2     6    5    7
3     9    4    9
4     4    5    7
5     5    8    9
6     5    9    6
7     4    7   10
8    10   10    9
9     7    5    4
10    7    7    5
> sapply(성적, sum)  # 각각의 열의 합계를 구한다.
국어 수학 영어 
  65   67   68 
> sapply(성적, mean) # 각각의 열의 평균을 구한다.
국어 수학 영어 
 6.5  6.7  6.8 

 

참고로 unlist() 함수를 적용해서 lapply()에 적용하면 sapply() 와 동일한 결과가 된다.

> unlist(lapply(성적, sum))
국어 수학 영어 
  65   67   68

> sapply(성적, sum)  # 각각의 열의 합계를 구한다.
국어 수학 영어 
  65   67   68

 


4. tapply(table apply) - 그룹으로 묶은 후 함수를 적용, 적용 값을 벡터나 행렬로 반환

tapply( data, Index, function .. ) 

 

index : 그룹지을 값을 지정한다.

 

> 환자 <- read.table("환자.txt", header=TRUE)
> 환자
  환자번호     입원일 나이 합병증      증세
1        1 2014-10-15   25  Type1      Poor
2        2 2014-11-01   34  Type2  Improved
3        3 2014-10-21   28  Type1 Excellent
4        4 2014-10-28   52  Type1      Poor
5        5 2014-11-01   37  Type2  Improved
6        6 2014-11-01   40  Type2  Improved

 
> factor(환자$합병증)
[1] Type1 Type2 Type1 Type1 Type2 Type2
Levels: Type1 Type2
> tapply(환자$합병증, 환자$합병증, length) # 합병증의 그룹별 환자의 수
Type1 Type2 
    3     3 
> tapply(환자$나이, 환자$합병증, mean)     # 합병증의 그룹별 나이의 평균
Type1 Type2 
   35    37 

 


5. mapply(multi simple apply) - 여러 개의 리스트에 함수를 적용

> m1 <- list(a = c(1:10), b = c(11:20))
> m2 <- list(c = c(21:30), d = c(31:40))

> mapply(sum, m1$a, m2$d) # 2개의 리스트에 적용
 [1] 32 34 36 38 40 42 44 46 48 50


> mapply(sum, m1$a, m1$b, m2$c, m2$d) # 2개의 리스트에 적용
 [1]  64  68  72  76  80  84  88  92  96 100

 

6. by - 특정한 그룹으로 묶어서 함수를 적용

 

> 성적 <- read.table("성적2.txt", header=TRUE)
> 성적 <- 성적[,c(-1,-2)]
> 성적
   국어 수학 영어 반
1     8    7    2  1
2     6    5    7  1
3     9    4    9  1
4     4    5    7  1
5     5    8    9  1
6     5    9    6  1
7     4    7   10  1
8    10   10    9  1
9     7    5    4  1
10    7    7    5  1
11    6    4    9  2
12    6    5    8  2
13    5    5    4  2
14    4    6   10  2
15    5    8    4  2
16    9    7    8  2
17   10   10    4  2
18    6    8    6  2
19    5    6    5  2
20    8    8    9  2



> by(성적[, 1:3], 성적$반, colMeans)
성적$반: 1
국어 수학 영어
 6.5  6.7  6.8
------------------------------------------------------------------------------
성적$반: 2
국어 수학 영어
 6.4  6.7  6.7



> by(성적[, 1:3], 성적$반, colSums)
성적$반: 1
국어 수학 영어
  65   67   68
------------------------------------------------------------------------------
성적$반: 2
국어 수학 영어
  64   67   67




> by(성적[, 3:5], 성적$반, summary)
성적$반: 1
      국어            수학            영어     
 Min.   : 4.00   Min.   : 4.00   Min.   : 2.00 
 1st Qu.: 5.00   1st Qu.: 5.00   1st Qu.: 5.25 
 Median : 6.50   Median : 7.00   Median : 7.00 
 Mean   : 6.50   Mean   : 6.70   Mean   : 6.80 
 3rd Qu.: 7.75   3rd Qu.: 7.75   3rd Qu.: 9.00 
 Max.   :10.00   Max.   :10.00   Max.   :10.00 
------------------------------------------------------------------------------
성적$반: 2
      국어           수학            영어     
 Min.   : 4.0   Min.   : 4.00   Min.   : 4.00 
 1st Qu.: 5.0   1st Qu.: 5.25   1st Qu.: 4.25 
 Median : 6.0   Median : 6.50   Median : 7.00 
 Mean   : 6.4   Mean   : 6.70   Mean   : 6.70 
 3rd Qu.: 7.5   3rd Qu.: 8.00   3rd Qu.: 8.75 
 Max.   :10.0   Max.   :10.00   Max.   :10.00


성적.txt


성적2.txt


인수구201411.csv


환자.txt


반응형