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
'IT기술 관련 > 빅데이터 관련' 카테고리의 다른 글
[R 프로그래밍] 데이터 프레임에서 두개의 랜덤값 뽑아내기 (0) | 2016.04.25 |
---|---|
[R 프로그래밍] 두개의 문자열 합치기 (0) | 2016.04.25 |
[R 프로그래밍] apply 함수군 (lapply, sapply, tapply) R 프로그래밍 (0) | 2016.04.23 |
[R 프로그래밍] [R] 몫과 나머지 (quotient and remainder) (0) | 2016.04.19 |
[Rstudio] Rstudio (치명적 오류: 접근 거부 - Fatal error: access denied) 해결 (3) | 2016.03.14 |