채니의 개발일기

R - 4 . dplyr()함수 : 데이터 병합, 데이터샘플링,중복데이터,중복데이터제거 본문

프로그래밍언어/R기초

R - 4 . dplyr()함수 : 데이터 병합, 데이터샘플링,중복데이터,중복데이터제거

윤채니챈 2023. 6. 23. 11:36
728x90
반응형

filter()

2023.06.21 - [R기초] - R - 1. dplyr()함수 :filter, select,mutate -> filter함수 설명

 

R - 1. dplyr()함수 :filter, select,mutate

dplyr()함수 - 데이터 조작과 변형을 위해 설계된 패키지 - 데이터프레임이나 테이블 형태의 데이터를 보다 쉽고 효율적으로 다룰 수 있도록 다양한 함수와 도구를 제공 dplyr의 대표적으로 사용되

xcwaonvy.tistory.com

 

• filter : %in%  연산자 -> 특정 열의 값이 주어진 값들 중 하나와 일치하는지 여부를 판단하는데 사용

filter(df, column_name %in% c(value1, value2, value3))

-in 연산자를 활용하여  Audi1과 Audi2 데이터 프레임생성

Audi1 =Audi %>%
  group_by(model)%>%
  summarise(count =n())%>%
  filter(model %in% c(' A1',' A2',' A3',' A4'))

Audi1

Audi2 =Audi %>%
  group_by(model)%>%
  summarise(price_m= mean(price))%>%
  filter(model %in% c(' A3',' A4',' A5',' A6'))
Audi2

 

- 결과

# A tibble: 4 × 3
  model count price_m
  <chr> <int>   <dbl>
1 " A1"  1347      NA
2 " A2"     1      NA
3 " A3"  1929      NA
4 " A4"  1381      NA


# A tibble: 4 × 2
  model price_m
  <chr>   <dbl>
1 " A3"  17409.
2 " A4"  20255.
3 " A5"  23577.
4 " A6"  22695.

 

데이터 병합

 

left_join() 함수:

left_join(df1, df2, by = "key")
  • 왼쪽 데이터 프레임(df1)과 오른쪽 데이터 프레임(df2)을 key 열을 기준으로 결합
  • 왼쪽 데이터 프레임(df1)의 모든 행을 유지하면서, 오른쪽 데이터 프레임(df2)과 일치하는 행만 결합
  • key 열 = 두 데이터 프레임에서 공통된 값

 

-Audi1에 left_join ()함수적용  : Adui1의 행을 유지하면서 Audi2의 일치하는 행만 결합

Audi_left = Audi1%>%
  left_join(Audi2, by='model')
Audi_left
# A tibble: 4 × 3
  model count price_m
  <chr> <int>   <dbl>
1 " A1"  1347     NA 
2 " A2"     1     NA 
3 " A3"  1929  17409.
4 " A4"  1381  20255.

right_join() 함수

right_join(df1, df2, by = "key")
  • 왼쪽 데이터 프레임(df1)과 오른쪽 데이터 프레임(df2)을 key 열을 기준으로 결합합니다.
  • 른쪽 데이터 프레임의 모든 행을 유지하면서, 왼쪽 데이터 프레임과 일치하는 행만 결합
  • key 열 = 두 데이터 프레임에서 공통된 값

-Audi1에 right_join ()함수적용  : Adui2의 행을 유지하면서 Audi1의 일치하는 행만 결합

Audi_right = Audi1 %>%
  right_join(Audi2, by = 'model')
Audi_right
# A tibble: 4 × 3
  model count price_m
  <chr> <int>   <dbl>
1 " A3"  1929  17409.
2 " A4"  1381  20255.
3 " A5"    NA  23577.
4 " A6"    NA  22695.

 

full_join()함수: 전체 행 합치기

Audi_full = Audi1%>%
  full_join(Audi2, by='model')
Audi_full
# A tibble: 6 × 3
  model count price_m
  <chr> <int>   <dbl>
1 " A1"  1347     NA 
2 " A2"     1     NA 
3 " A3"  1929  17409.
4 " A4"  1381  20255.
5 " A5"    NA  23577.
6 " A6"    NA  22695.

 

데이터 샘플링

sample 함수: 데이터 프레임 또는 테이블에서 지정된 개수의 무작위 행을 추출하는 함수

 

함수로드

sample_n(data, size, replace = FALSE, weight = NULL)

 

  • data: 추출할 행을 포함하는 데이터 프레임
  • size: 추출할 행의 개수
  • replace: 추출할 때 중복을 허용할지 여부를 나타내는 논리값-> 기본값은 FALSE(중복된 행 실행 x), TRUE(중복허용)
  • weight: 선택된 행의 가중치를 지정하는 열. 해당 열에 지정된 가중치에 따라 행이 선택. 기본값은 NULL

1.sampe_n : 샘플데이터 갯수지정

set.seed(123)
Audi3 = Audi%>%
  sample_n(size =5)
Audi3

 

-> set.seed(123) = 난수를 생성하는 알고리즘

model year price transmission mileage fuelType tax  mpg engineSize
1    A4 2017 19220       Manual   14378   Diesel  30 67.3        2.0
2    Q5 2016 28698    Automatic   44419   Diesel 235 42.2        3.0
3    A4 2018 20290    Automatic   19450   Petrol 150 50.4        1.4
4    A3 2018 14500    Semi-Auto   22496   Diesel 145 72.4        1.6
5    TT 2015 16406    Semi-Auto   12123   Petrol 160 44.8        2.0

 

2. group_by 지정후 데이터 추출

set.seed(123)
Audi4 = Audi%>%
  group_by(transmission)%>%
  sample_n(size =3)
Audi4

결과: transmission의 각 변수를 3개씩 추출

# A tibble: 9 × 9
# Groups:   transmission [3]
  model  year price transmission mileage fuelType   tax   mpg engineSize
  <chr> <int> <int> <chr>          <int> <chr>    <int> <dbl>      <dbl>
1 " A4"  2019 24199 Automatic       4035 Diesel     145  50.4        2  
2 " Q5"  2019 34000 Automatic       5492 Diesel     145  38.2        2  
3 " A8"  2019 41606 Automatic       2117 Diesel     145  40.4        3  
4 " A3"  2018 21499 Manual          4012 Petrol     150  42.2        1.5
5 " Q2"  2019 21512 Manual            12 Diesel     145  49.6        1.6
6 " Q3"  2015 16450 Manual         37182 Diesel     160  49.6        2  
7 " Q5"  2019 43990 Semi-Auto       5593 Diesel     145  36.2        2  
8 " A3"  2019 32490 Semi-Auto        318 Petrol     150  33.2        2  
9 " A3"  2016 15491 Semi-Auto      55561 Petrol     125  48.7        2

 

3. 비율로 추출 : sample_frac

set.seed(123)
Audi5 = Audi%>%
  sample_frac(size = 0.3)
Audi5

 

4.중복데이터처리

set.seed(1234)
Audi6 = Audi %>%
  mutate(Unique_key =1:nrow(Audi))%>%
  sample_frac(size = 1.5,replace = TRUE)
Audi6

 mutate(Unique_key =1:nrow(Audi)) : 1에서 Audi의 행의 수까지 순차적으로 벡터생성

sample_frac(size = 1.5,replace = TRUE) : 원래 데이터프레임에 1.5배의 크기로 생성, replace=True로 중복생성

 

5.dupulicate() = 중복확인함수

duplicated(Audi6$Unique_key)
sum(duplicated(Audi6$Unique_key))

- 중복확인함수 확인하기

[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
  [18] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
  [35] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
  [52] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
  [69] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
  [86] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [103] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [120] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [137] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [154] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [171] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
 [188] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [205] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [222] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [239] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [256] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [273] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [290] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [307] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [324] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [341] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [358] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [375] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [392] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [409] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [426] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [443] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
 [460] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [477] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [494] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [511] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [528] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [545] FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [562] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [579] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [596] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
 [613] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
 [630] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
 [647]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [664] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
 [681] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
 [698] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [715] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [732] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [749] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [766] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
 [783] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
 [800] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [817] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
 [834] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
 [851] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [868] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
 [885] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [902] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
 [919] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE
 [936] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE
 [953] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
 [970] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [987] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
 [ reached getOption("max.print") -- omitted 15002 entries ]
> sum(duplicated(Audi6$Unique_key))
[1] 7727

:Audi6$unique_key의 중복된 함수 갯수는 7727인것을 알 수 있음(True의 갯수 = 7727)

 

6.중복데이터제거 -  distinct()

distinct() 함수: dplyr 패키지에서 제공되는 함수로, 데이터 프레임에서 고유한(unique) 행만 선택하는 역할을

 

Aud6_1 = Audi6 %>%
  distinct(Unique_key,.keep_all = TRUE) 
Aud6_1

distinct(Unique_keyf를 기준으로 중복제거, .keep_all=True: 중복이 발생한 행 중 하나를 남기면서 나머지 열의 값들을 유지)

 


사용데이터

100,000 UK Used Car Data set | Kaggle

 

100,000 UK Used Car Data set

100,000 scraped used car listings, cleaned and split into car make.

www.kaggle.com

 

- Audi 데이터 로드

DIR = "/Users/yunchaewon/Desktop/r-data analysis/Rbasic/UsedCar/"
Audi = read.csv(paste0(DIR, "Audi.csv"),stringsAsFactors = FALSE)
str(Audi)

- 데이터 설명

data.frame':	10668 obs. of  9 variables:
 $ model       : chr  " A1" " A6" " A1" " A4" ...
 $ year        : int  2017 2016 2016 2017 2019 2016 2016 2016 2015 2016 ...
 $ price       : int  12500 16500 11000 16800 17300 13900 13250 11750 10200 12000 ...
 $ transmission: chr  "Manual" "Automatic" "Manual" "Automatic" ...
 $ mileage     : int  15735 36203 29946 25952 1998 32260 76788 75185 46112 22451 ...
 $ fuelType    : chr  "Petrol" "Diesel" "Petrol" "Diesel" ...
 $ tax         : int  150 20 30 145 145 30 30 20 20 30 ...
 $ mpg         : num  55.4 64.2 55.4 67.3 49.6 58.9 61.4 70.6 60.1 55.4 ...
 $ engineSize  : num  1.4 2 1.4 2 1 1.4 2 2 1.4 1.4 ...
  1. model: 자동차 모델을
  2. year: 자동차의 연식을
  3. price: 자동차의 가격
  4. transmission: 자동차의 변속기 종류
  5. mileage: 자동차의 주행 거리
  6. fuelType: 자동차의 연료 종류
  7. tax: 자동차에 부과되는 세금
  8. mpg: 자동차의 연비
  9. engineSize: 자동차의 엔진 크기
728x90
반응형