R, apply, lapply, sapply, tapply

R 2019. 9. 15. 11:03

1) apply
apply() 함수는 행렬이나 데이터 프레임을 행 단위로, 또는 열 단위로 행렬의 합이나 평균, 표준편차 등을 계산할 때 쓴다. 
먼저 행렬을 하나 아무렇게나 만든다.

 

> a<-matrix(c(2,5,3,4,5,2,4,3,5,2,1,1),3,4,byrow=T) 
> a  
     [,1] [,2] [,3] [,4]  
[1,]    2    5    3    4  
[2,]    5    2    4    3  
[3,]    5    2    1    1 


3 x 4 행렬이다. 첫번째 인자는 행렬 변수, 두번째 인자는 1 또는 2인데 1이면 행 단위로 계산한다는 뜻이고, 2이면 열 단위로 계산한다는 뜻이다. 세번째 인자는 연산할 함수 이름이다. 그러니까 위의 3 x 4 행렬의 원소들을 행 단위로 합하고 싶으면

 

> apply(a,1,sum)  
[1] 14 14  9 


같은 행렬의 원소들 각 열의 평균을 구하고 싶으면

 

> apply(a,2,mean)  
[1] 4.000000 3.000000 2.666667 2.666667 


2) lapply
apply랑 비슷한데 리스트나 데이터 프레임을 입력값으로 쓰고, 출력값은 리스트 형태로 나온다. 변수 별로 합이나 평균을 계산하기 때문에 apply에서 썼던 두번째 인자(1 또는 2)는 필요 없다.

 

> b<-data.frame(a)
> b 
  X1 X2 X3 X4 
1  2  5  3  4 
2  5  2  4  3 
3  5  2  1  1 
> lapply(b,mean) 
$X1 
[1] 4 

$X2 
[1] 3 

$X3 
[1] 2.666667 

$X4 
[1] 2.666667 


3) sapply
lapply와 거의 비슷한데 입력값은 리스트나 데이터 프레임을 쓰지만, 출력값은 리스트가 아닌, 벡터 형태를 쓴다.

 

> d<-c(1,2,3,4) 
> e<-c(3,2,4,3) 
> f<-list(d,e) 
> g<-data.frame(d,e)
> f 
[[1]] 
[1] 1 2 3 4 

[[2]] 
[1] 3 2 4 3 

> g 
  d e 
1 1 3 
2 2 2 
3 3 4 
4 4 3 
> sapply(f,mean) 
[1] 2.5 3.0 
> sapply(g,mean) 
  d   e  
2.5 3.0  
> class(g) 
[1] "data.frame" 
> class(sapply(g,mean)) 
[1] "numeric" 

 

4) tapply
변수가 여러 개 있을 때 한 변수를 다른 변수의 값을 기준으로 합이나 평균을 계산할 때 쓴다. 첫번째 인자는 계산하고자 하는 변수, 두번째 인자는 기준으로 삼는 변수, 세번째 인자는 함수 이름이 된다.

먼저 과일(fruit)과 중량(weight) 두 개의 변수를 만든다.

 

> fruit<-c("banana","apple","apple","banana","orange","banana") 
> weight<-c(2,3,3,5,2,5) 


둘 다 여섯개의 원소를 갖고 있는데 아직 data.frame() 함수를 써서 둘을 붙이진 않았지만 tapply() 함수를 쓸 땐 다음과 같이 합쳐진 테이블이라고 생각한다.

 

no

fruit

weight

1

banana

2

2

apple

3

3

apple

3

4

banana

5

5

orange

2

6

banana

5


즉 총 여섯개의 과일이 있고 그 중 바나나가 셋이며, 사과는 두 개, 오렌지는 하나이다. 과일들은 각각 중량 정보를 갖고 있다. tapply() 함수는 다음과 같이 쓴다.

 

> tapply(weight,fruit,mean) 
 apple banana orange  
     3      4      2  


과일 이름을 기준으로 사과끼리, 바나나끼리, 오렌지끼리 평균을 구해서 테이블을 만들었다. data.frame() 함수로 합친 데이터의 경우엔 변수 이름 쓸 때만 주의하면 된다.

 

> fruit_weight<-data.frame(fruit,weight) 
> tapply(fruit_weight$weight,fruit_weight$fruit,mean) 
 apple banana orange  
     3      4      2  


여기서 attach()를 쓰면 처음에 했던 것처럼 data.frame()이라도 변수 이름만 간단하게 쓰는게 가능하다.

 

> rm(fruit,weight) 
> attach(fruit_weight) 
The following objects are masked _by_ .GlobalEnv: 

    fruit, weight 

> tapply(weight,fruit,mean) 
 apple banana orange  
     3      4      2  
Posted by jujaeuk
,