본문 바로가기
R프로그래밍

R프로그래밍 - Sapply함수와 lapply함수 알아보기

by 미스터탁 2020. 6. 26.

이전 포스팅과 이어지는 포스팅입니다.

 

https://bluediary8.tistory.com/95

 

R프로그래밍 - 문자열 분리하는 함수 str_split / list구조

문자열을 구분하는 str_split함수에 대해 다루어 보겠습니다. str_split함수는 str_detect와 마찬가지로 stringr패키지 안에 들어가 있는 함수입니다. 다음과 같이 '주소' 문자형 벡터가 있을때 여기서 서�

bluediary8.tistory.com

 

다음과 같이 '주소' 문자형 벡터가 있을때 여기서 서울시/경기도/경기도/전라남도만 추출하고 싶다고 가정 해보겠습니다.

 

c("서울시 서대문구 신촌동","경기도 안산시 단원구",  "경기도 평택시","전라남도 연수시 선원동 124")

 

str_split을 통해 공백으로 분리하면 아래화면과 같이 list를 추출하게 됩니다.

 

addr<-c("서울시 서대문구 신촌동","경기도 안산시 단원구",
        "경기도 평택시","전라남도 연수시 선원동 124")

library(stringr)
str_split(addr," ")

 

 

 

여기서 우리는 list의 각각의 큰방에서 첫번째 작은방만 추출해야합니다.

 

직관적으로 for문을 이용해서 각각의 큰방에 접근해서 첫번째 작은방만 가져올 수 있겠죠

 

x2<-str_split(addr," ")
x2
## for문을 활용한 방법

add1<-c()
for( i in 1:length(x2)){
 add1[i]<- x2[[i]][1]    ## i번째 큰방의 첫번째 작은방을 가져옴
}
add1

 

 

이와 같이 for문을 이용해서도 할 수 있지만, 코딩을 할때에 for문을 사용하는 것은 사실 바람직하지 않습니다.

 

for문을 어쩔수 없이 반복적인 작업을 진행할 때에 사용하는 것이지, 많이 사용하는 것은 비효율적입니다.

 

sapply 함수는 이를 간단하게 해결해주는 함수입니다.

 

sapply를 list의 큰방에 접근해서 함수를 적용시켜주는 함수입니다.

 

예를 들면 저 x2 list의 각각의 큰방의 길이를 알고 싶다면 다음과 같이 쓸수 있습니다.

 

 

sapply(x2,length)

 

 

아래와 같이 잘려있던 문자열들을 간단하게 하나로 합칠 수도 있습니다.

sapply(x2,paste0,collapse=" ")

 

이렇게 list의 큰방들에 대해서 함수를 각각 한번에 적용시켜 줄수 있게 도와주는 것이 sapply함수입니다.

 

 

 

다시 돌아와서 x2 list에서 첫번째 큰방을 가져오려면 sapply함수에서 벡터의 첫번째 작은방만 가져오는 함수가 있어합니다.

 

그런데 이 함수는 존재 하지 않으므로 우리가 만들어 주어야합니다.

 

사용자가 만드는 함수를 사용자 정의함수라고 하고

 

아래와 같이 쓸수 있습니다. 

 

함수명 <-function(인자){

  기능  

}

 

간단하게 숫자를 받아서 1을 더하는 함수를 만들어 보도록 하겠습니다

sum1<-function(x){
  x+1
}

 

 

인자는 꼭 하나만 있어야 하는 것은 아닙니다. 두개의 인자를 받아 두개의 합을 구하는 함수를 만들어 보도록 하죠

sum2<-function(x,x2){
  x+x2
}
sum(1,2)
sum(3,4)

 

이제 우리가 필요한 함수인 '첫번째 작은방을 출력해주는 함수'를 만들어 보도록 하죠

 

search<-function(x){
  x[1]
}

search(c(1,2,3))
search(c("d","b","c"))

 

 

 

이함수를 이제 x2 list에 sapply함수와 함께 적용하면 됩니다.

 

코드를 다시 정리하면 다음과 같습니다.

 

 

addr<-c("서울시 서대문구 신촌동","경기도 안산시 단원구",
        "경기도 평택시","전라남도 연수시 선원동 124")
search<-function(x){
  x[1]
}

x2<-str_split(addr," ")
sapply(x2,search)

 

여기서 좀 더 응용을 해서 search함수를 만들때 인자를 하나 더 받아 내가 원하는 곳의 작은방을 뽑도록 할수 있습니다. 

 

 

 

 

 

search2<-function(x,i){
  x[i]
}
x2<-str_split(addr," ")
sapply(x2,search2,1)
sapply(x2,search2,2)
sapply(x2,search2,3)

마지막에 NA가 나온 이유는 x2의 세번째 큰방은 길이가 2인 벡터이기 때문입니다.

 

 

 

lapply의 경우 sapply와 하는 기능의 같다라고 보시면 됩니다.

 

하지만, sapply라는 결과값을 vector로 반환하는 반면 lapply는 아래화면과 같이 결과값을 리스트 자체를 유지를 합니다.

 

복잡한 코드를 작성하다보면 list형태를 유지해야하는 경우가 있는데, 그러한 경우에 간혹 쓰입니다.


# sapply과 lapply의 비교 
sapply(x2,search2,1)
lapply(x2,search2,1)

반응형

댓글