안녕하세요. 이번 포스팅에서는 생각보다 자주 사용하는 함수를 소개하려고 합니다.
tidyverse 패키지에서는 주로 filter 함수를 이용해서 원하는 행을 가져오는데요. 이번에 소개할 함수는 행의 위치에 맞는 데이터를 가져오는 dplyr 패키지의 slice 계열 함수입니다.
slice() lets you index rows by their (integer) locations. It allows you to select, remove, and duplicate rows. It is accompanied by a number of helpers for common use cases:
( slice()를 사용하면 행을 (정수) 위치별로 인덱싱할 수 있습니다. 행을 선택, 제거 및 복제할 수 있습니다. 일반적인 사용 사례에 대한 여러 도움말이 함께 제공됩니다 )
- slice_head() and slice_tail() select the first or last rows.
- slice_sample() randomly selects rows.
- slice_min() and slice_max() select rows with highest or lowest values of a variable.
slice_head, slice_tail은 데이터의 처음과 끝에서 부터 주어진 수만큼 데이터를 가져오는 함수이며 slice_sample은 행을 무작위적으로 선택하는 함수입니다. 마지막으로 slice_min과 slice_max는 가장 변수의 값이 작거나 큰 행부터 순서대로 가져오는 함수입니다.
또한 5개의 함수 모두 grouped data가 주어진 경우 연산이 각 그룹별로 적용된 결과를 반환합니다.
참고로 slice_min과 slice_max는 order_by로 선택의 기준이 되는 변수를 입력해야 합니다.
또한 slice_head와 slice_tail은 n인자에 몇개의 행을 가져올지 입력해야 합니다.
마지막으로 slice는 위치(정수)를 제공해야 하며 양의 정수를 입력 시 해당 행이 출력되며, 음의 정수를 입력시 해당 행을 제외한 나머지 행이 출력됩니다.
이제 iris 데이터를 가지고 예를 들어보겠습니다.
iris %>% slice(c(10,20,30))
iris %>% slice_head(n=3)
iris %>% slice_max(order_by = Sepal.Length)
- 처음 코드에서 10번째, 20번째, 30번째 행을 가지고 왔습니다. (* iris[c(10,20,30),]과 같은 결과 입니다. )
- 두번째 코드에서 첫 행부터 3개의 데이터를 가지고 왔습니다. (* head(iris, 3)와 같은 결과 입니다. )
- 세번째 코드에서는 Sepal.Length가 가장 큰 행을 가지고 왔습니다. (* iris[which.max(iris$Sepal.Length),]와 같습니다)
그룹화되지 않은 데이터에서는 기존 함수들로 쉽게 대체가 가능해서 크게 유용하지 않다고 생각할겁니다.
이제 iris 데이터를 Species 변수로 그룹화하여 각 함수를 적용해보겠습니다.
iris.group <- iris %>% group_by(Species)
iris.group %>% slice(c(10,20,30))
iris.group %>% slice_head(n=3)
iris.group %>% slice_max(order_by = Sepal.Length)
- 첫번째 코드의 결과로 각 그룹별(Setosa, versicolor, virginica) 데이터에서 10번째, 20번째, 30번째 데이터를 가져옵니다.
- 두번째 코드의 결과로 각 그룹별(Setosa, versicolor, virginica) 데이터에서 첫 행부터 3개의 데이터를 가져옵니다.
- 세번째 코드의 결과로 각 그룹별(Setosa, versicolor, virginica) 데이터에서 Sepal.Length가 가장 큰 행을 가져옵니다.
그룹화된 데이터와 사용시 정말 유용하죠?
참고로, 범주형 자료분석 할때, 빈도 테이블을 통해 데이터 구현할 때 몇 번 사용하긴 했지만 일반적으로 자주 사용할 일은 없는 특정행을 여러번 선택하기는 다음과 같이 구현할 수 있겠습니다.
iris %>% slice(rep(1, 10))
- 1번째 행이 10번 중복되어 출력되었습니다.
마지막으로 행을 무작위적으로 선택하기는 n(횟수), prop(비율) 인자를 통해 다음과 같이 구현할 수 있습니다.
(물론 시드넘버를 고정한 것이 아니라면 결과는 매번 다릅니다..)
iris %>% slice_sample(n=10)
iris %>% slice_sample(prop=1/15)
'Data Science > Manipulation' 카테고리의 다른 글
[R] 사용자 정의 함수 관련 잡기술 (1) | 2024.10.19 |
---|---|
[EDA] 상관계수 시각화 (Visualization of Correlation Coefficient) with R (0) | 2024.09.27 |
[Data Science With R] 16. 리스트열(List-column)을 이용한 모델 (0) | 2023.09.02 |
[R] all_of와 any_of를 사용한 변수 선택 (조건을 이용한 선택 추가) (1) | 2023.07.29 |
[Data Science With R] 15. Modelr을 활용한 모델 생성 (0) | 2023.05.17 |