R복습_dplyr패키지(추출및 정렬함수,통계요약함수,샘플데이터추출함수)

2024. 10. 4. 11:44R분석

패키지

패키지란 다른 사용자가 만든 여러함수들을 기능에따라 묶어서 제공하는기능을 말한다. 하나의 패키지를 r스튜디오안에 설지하면 그 패키지안에 포함된 여러함수들을 사용할 수있다.

 

 


dplyr 패키지

패키지의 종류는 상당히많다.  그중에서는 거의 사용되지않는 패키지도있을뿐더러 자주 사용되는패키지도 있다.  그중 dplyr패키지는 데이터가공시 실무에서 자주 사용되는패키지중 하나로,  r의 내장함수와 비슷한역할을하는 함수들이 있지만,  내장함수보다도 더빠르고 쉽게 이용이 가능하다.

 

패키지 설치

#패키지 설치
install.packages('dplyr')
library(dplyr)

패키지 안에 있는 내장함수를 사용하려면 먼저 패키지를 스튜디오 내부에 설치해야한다. 설치방법은 install.packages('패키지명')이며 설치가 완료된 후에는 library(패키지명)을 사용하여 패키지를 로드후에 사용해야한다.

 

filter()함수

#filter(데이터, 조건식) : 조건식에 부합하는 행만 추출

#데이터 셋 불러오기
mtcars #데이터학습을 위한 r의 내장 데이터 셋 사용

#1)실린더의 개수가 4개인 자동차만 추출
head(filter(mtcars,cyl==4))
#head : 상위 6개만 가져오기

filter()함수는 filter(데이터,조건식)의 형태로 적으며, 앞의 데이터에서 조건식에 해당하는 값의 데이터만 불러온다.
또한, filter함수뿐만 아니라 dply패키지에서 주로 사용되는 함수가 head라는 함수로, 데이터에서 상위 6개만 가져온다.
로드할 데이터의 양이 많을때 주로 사용한다.

 

selected()

#select(데이터, 열1, 열2,...) : 지정한 열 데이터 추출
#am,gear열 추출
head(select(mtcars,am,gear))

selected()는 selected(데이터, 열1, 열2)의 형식으로 적으며, selected함수안에 적힌 열을 조회해주는 함수이다.


arrange()

#arrange(데이터, 열1...) :데이터를 오름차수으로 정렬
#desc()함수를 함께 사용하면 내림차순으로 정렬

#1)wt(무게)열 순으로 오름차순 정렬
head(arrange(mtcars,wt))


#2)mpg(연비)열 기준으로 내림차순 정렬
head(arrange(mtcars,desc(mpg)))


#3) 내림차순과 오름차순 혼용
# mpg,wt기준 
head(arrange(mtcars,mpg,wt))
#다중열 동시에 사용가능하나, 앞에 나열된 열 기준으로 먼저 오름차순
#mpg로 정렬하되, mpg값에 같은값이 있다면 wt값으로 오름차순 하겠다는 의미

head(arrange(mtcars,mpg,desc(wt)))
#내림차순과 오름차순 혼용했을때도 먼저 나열된 열 먼저 오름차순으로 정렬하되,
#같은 값이 있다면 내림차순으로 정렬하겠다는 의미

arrange는 arrange(데이터, 열1,...)로 작성하며, 오름차순으로 데이터를 정렬해주는 함수이다. 함수의 디폴트가 오름차순이기때문에 열이름만 적게되면 무조건  적힌 열기준으로 오름차순된다.

다중열 사용

다중열을사용할때는 arrange(데이터, 열1,열2..)의형태로 사용하며,첫번째나열된 열부터기준으로 정렬하되 같은 값이 있다면 두번째 열 기준으로, 두번째 열에서도같은값이 있다면 세번째 열의 기준으로 정렬된다. 위 쿼리의 경우, 오름차순으로mtcars데이터를 mpg를 기준으로정렬하되, mpg에 같은값이있다면 그데이터는 wt가더 작은값으로 오름차순하여 정렬하라는뜻이다.

 

냬림차순 혼용


내링차순과 혼용하고싶다면 desc(열1)의 방법으로 내림차순과 함께 작성하면된다. 이렇게 2개이상의 열을 arrange안에 나열한경우,  나열된 첫번째 열의 옵션에맞게 먼저 오름차순 정렬되고, 만약 그안에서(mpg)안에서 동일값이 있다면 wt가 더 큰값으로 내림차순하겠다는 것이다.


mutate()

#mutate(데이터,추가할 열=데이터) : 데이터에 새로운 열 추가
#1) years열 추가, 연도
mutate(mtcars,years='1974')

#2)mpg순위 열 추가
#**rank()함수 : 오름차순 순으로 순위 정함
rank(c(10,11,12,13,14,15)) #값 나오고 랭크값 출력
rank(c(11,9,4,50,23))
rank(c(10,10,11,12,13)) #같은 값이 2개인 경우에만 소수점표시
#1위 : 1.5위 2개
rank(c(10,10,10,11,3,5,12,80))
#같은 값이 3개이상이면 동순위로 출력
rank(10,20,11)#rank의 값은 항상 벡터로 전달!!

head(mutate(mtcars,mpg_rank=rank(mpg)))

mutate는 데이터에 새로운열을 추가할때사용하는 함수로, mutate(데이터, 열명=값)의 형태로 적는다.  원래 데이터프레임에 열을 추가하는 경우, 새로운 열을 벡터형태로 만들어, 데이터프레임명$새로운 열명<- 새로운열값(벡터)의 형태로전달되어야하지만, mutate를 사용하게 되면 손쉽게 값을 추가 할 수 있다. 첫번째 쿼리의 경우, 년도를 나타내는 years열에 1974년이라는 데이터값을추가한것이다.

 

rank()함수

dplyr 패키지와 함께 사용되는 함수이다. rank는 무조건오름차순으로순위를 매겨 출력하는함수로, 다른데이터와 함께사용하면 rank(데이터, rank(열))의 형태로 사용한다. 

rank의특징은 rank를출력했을때 값이나오고 그 밑에 순위가 함께 출력된다는 것인데, 만약동점인 점수가 2개라면 순위를 소수점으로 표시해준다. 허나이것은 동점인점수가 3개 이상이라면해당하지 않는 옵션이고 이때부터는 그냥 동순위로출력된다.

이처럼 rank함수와mutate함수를사용하여 mpg가 작은 순서대로 순위를매겨 새로운 열에 저장하여 데이터에 추가한 결과이다. rank함수를 사용할때 굳이 이름을지정하여 변수에 저장하지 않아도되지만,추가된 열의 이름을지정하고싶다면 

mutate(데이터, 새로운 열명 = rank(열))의형태로 적어 사용한다.

 

 

 

distinct()

#distinct(데이터, 열) : 해당 열에서 중복값 삭제
distinct(mtcars,cyl)
mtcars
#전체데이터에서 일단 먼저 출력된 순서대로 값이 남고, 그 다음에 같은 값이 
#등장하면 두번째로 등장한 값은 중복처리되어 삭제됨
#해당값을 가진 맨 처음행만 삭제처리가 되지 않는것..!
distinct(mtcars,gear)

#2)한번에 여러 열의 중복 삭제하기
distinct(mtcars,cyl,gear)
#한번에 여러열을 나열 했을때 열대로 중복값 삭제가 아니라
#한줄의 행으로 데이터를 인식을 해서 두개의 열값이 모두 같은 행 제거

distinct()는 중복값을 가진데이터를제거하는 함수로distinct(데이터,열)의 형태로 적어 사용한다. 

하지만 distinct의 특징은 전체데이터가 존재할때 중복데이터 중 두번째로등장한데이터를 삭제하게되는데 해당값을 가진맨처음 행만 중복되지않는 값이라고 인식하는것이다.

distinct는 한번에 여러열을 기입하여 사용할 수도있다. distinct(데이터,열1,열2)의 형태로 적게되면 열마다 가진 중복값을 모두 삭제하는것이 아니라, 두 열을 출력했을때 행으로 인식하여 행별로 두값이 모두 중복되는 데이터를 삭제한다.

 

 

summarise()

#summarise(데이터, 열이름=통계함수(열)) : 통계함수와 함께사용하여 데이터 요약을 확인
summary(stu.info) #데이터프레임에서 사용하는 summary는 단순 요약 통계만 출력
summarise(mtcars,cyl_mean=mean(cyl))
summarise(mtcars,gear_max=max(gear))

#1) cyl열의 평균, 최대, 최소값 확인(한번에 출력가능!
summarise(mtcars,
          cyl_mean=mean(cyl),
          cyl_min=min(cyl),
          cyl_max=max(cyl)) #괄호안에 나열하여 한꺼번에 출력 가능

#2)열 이름 지정하지 않아도 사용가능
summarise(mtcars,mean(cyl))
summarise(mtcars,min(cyl),max(cyl))

summarise()는 통계함수와 같이 사용할 수 있는 데이터 요약함수이다. 기존 데이터프레임에서는 summary라는요약통계 함수를 사용한적이 있는데, summary는 단순 요약만을보여준다면, summarise는 직접사용하고자하는 통계함수를 같이사용할 수있어, 보다 데이터분석을 구체적으로할수있다.

summarise는 summarise(데이터, 통계함수(열))의 형태로사용하며,  출력이름을지정하고싶을땐 summarise(데이터,열명=통계함수(열))의 형태로 작성한다. 

summarise는 동시에 여러 열의 값을 입력하고 출력할수 있는데, 이때는 콤마로 값을구분하여 사용한다.

 

 

 

group_by()

#group_by(데이터, 열) : 해당 열의 데이터를 기준으로 그룹별로 데이터를 묶음
#주로 다른 함수와 사용!

#1) cyl데이터로 그룹화
gr_cyl=group_by(mtcars,cyl)
gr_cyl #group_by만 사용했을경우 그룹화한걸 확인할 순 없음
#그룹화를 시킨 후에 다른 함수와 사용했을때 그룹화된것을 확인할 수 있음

#다른 함수와 사용
summarise(gr_cyl) #그룹화 결과 확인가능
summarise(gr_cyl,n())
#[4,6,8]옆에 있는 숫자들은 그룹별로 요소값이 몇개인지확인
#n() : 데이터의 값과 해당하는 개수 확인 함수
#cyl데이터를 그룹화 한 후 요약하면 총 4,6,8값이 출력
#이에 따른 데이터의 요소값이 11,7,14개임을 확인

#2) cyl열 그룹마다 gear값이 중복인 데이터를 제외한 개수
gr_cyl <- group_by(mtcars,cyl)
summarise(gr_cyl,n_distinct(gear))
#n_distinct() : 중복데이터를 제거한 고유값 개수확인
#n(), n_distinct()는 단독사용 불가
#summarise, filter,mutate와 함께 사용가능

group_by()는 특정 열을 기준으로 같은 값이 있다면 그룹화해주는 함수이다. group_by(데이터,열)의 형태로적어사용한다.

group_by의 특징은.group_by만했을때는 그룹화된 결과를확인할 수 없다는것이다. 그룹화한후, 그 데이터를가지고 다른 함수와 함께 적용해서 사용했을때 그룹화의 결과확인이 가능하다.

 

 

다른함수와의 사용

group_by는 보통 summarise와 주로 사용된다.  summarise( group_by한데이터, n())으로 적게되면, n()은 그 개수를 반환하는 함수이기때문에 그룹화한데이터의 요소가 몇개인지확인하는 쿼리문이된다.

또한여기서 중복된데이터를 제거한 후 남은 고유값의 개수가 몇개인지 반환하는 n_distinct함수가 있는데 이것을 summarise와 함께사용하여 summarise(group_by한 데이터, n_distinct())의 쿼리문으로 적게되면 그룹화한 데이터중에 중복인 데이터를 제외한 개수를 보여달라는뜻이된다. 

참고로 n()과 n_distinct는 단독 사용이 불가하며, 주로 summarise, filter, mutate와함께  사용이 가능하다.

 

 

sample_n()

#sample_n(데이터, 추출할 샘플 개수) : 전체 데이터에서 개수 기준으로 샘플 추출
#mtcars에서 10개 데이터 샘플
sample_n(mtcars,5)
head(sample_n(mtcars,2))
head(sample_n(mtcars,4))

sample은 전체데이터에서 개수 기준으로 샘플데이터를 추출해주는 함수이다. sample(데이터,개수)의 형식으로 사용하며,

적은 개수에 맞게샘플데이터를 추출하여 출력한다.

 

 

sample_frac()

#sample_frac(데이터, 추출할 샘플 비율) : 전체 데이터에서 비율기준으로 샘플추출
sample_frac(mtcars,0.2) #비율이기때문에 소수로 적어야함
sample_frac(mtcars,0.5)
sample_frac(mtcars,0.9)

sample_frac()함수는 sample_n()데이터와 사용법이 거의 동일하다. sample_fare는 전체 데이터에서 비율 기준으로 샘플을 추출하는 함수이며, 비율이기때문에 정수가 아닌, 실수로 적어, 비율로 그 값을전달해야한다.

 

 

%>% 파이프 연산자

#파이프 연산자 
#%>% : 데이터에 여러개의 함수를 한줄에 적용
gr_cyl<- group_by(mtcars,cyl)
summarise(gr_cyl,n())

group_by(mtcars,cyl) %>% summarise(n())
#원래 첫번째 같은 방법으로 따로 써야했지만 %>% 사용하여 한꺼번에 사용

#2) mutata()로 mpg순위 열 추가후 순위를 기준으로 정렬
mp_rank <- mutate(mtcars,mpg_rank=rank(mpg))
arrang(mp_rank)# %>% 연산자 사용X

mutate(mtcars,mpg_rank=rank(mpg)) %>% arrange(mpg_rank)

파이프연산자는 %>%의 형태로 사용하며 데이터에 여러개의 함수를 한줄에적용할 수 있도록 간편하게만들어주는 함수이다. 파이프연산자를 사용하지않았다면 첫번째 수행한 데이터의값을 변수에저장하고 저장된 변수명을 가지고 다시 새로운 함수에적용하여 넣어야 했다면, 파이프 연산자를사용하면 함수들을 한줄에나열한 후, 연결점에 파이프 연산자만 적어주면 된다.

 

 

dplyr함수 활용 실습

#==========dplyr함수 실습==========#

#<실습>
#1)mtcars 데이터 에서 mpg가 20이상이고 gear가 3인 데이터 출력
mtcars
filter(mtcars,mpg>=20 & gear==3)

#2)mtcars 데이터에서 hp(마력)순위를 저장하는 hp_rank열 추가후
#hp_rank 열기준으로 오름차순 정렬(파이프연산자 사용)
mutate(mtcars,hp_rank=rank(hp)) %>%  arrange(hp_rank)


#3)matcars 데이터를 mpg데이터로 오름차순 정렬하되,
#mpg가 같은 데이터는 hp데이터로 내림차순 정렬
arrange(mtcars,mpg,desc(hp))


#4)mtcars 데이터에서 hp열의 평균과 mpg의 중앙값 확인
summarise(mtcars,mean(hp),median(mpg))

#5) mtcars에서 샘플데이터 5개 추출
sample_n(mtcars,5)

#6) gear열 기준으로 그룹화 한 후,
#gear의 값과 해당하는 개수 출력(파이프연산자 사용)group_by
group_by(mtcars,gear) %>% summarise(n())

 


 

학습일기

드디어 본격적인 패키지활용부분에 들어왔다..!! r에서 패키지부분이,특히 다른 언어들의함수들과 비슷한점이 많은것같다. 특히 오늘 dplyr에서는 group_by나 arrange가 sql에서는 거의기초 구문으로활용되서 그런지 특히 이두개가 더 다른 언어들과 닮아있다고 느꼈다. 솔직히select의 경우 왜패키지를사용하지..? 그냥 열 조회하는게 더익숙해서 그런지 그게더 쉽다고 느꼈는데 패키지를 배우고 연습하면서 패키지가 손에 익다보니 왜 패키지를 사용하는지 잘 알것도같았다..ㅎㅎ 손에익기만 하면 정말훨씬간편하고 활용하기나름으로 정말 잘 사용할 수 있는 r의 기능인것같다. 다른패키지들도 열심히배워야겠다..!!!!