개발자입니다
섹션 9. Chapter 09 dplyr 패키지 (Youtube HelloJany) 본문
■ dplyr 패키지
데이터 가공 마법사
%>% 연산자로 각 조작을 연결할 수 있음
-데이터 추가 및 중복 데이터 제거
library(dplyr, warn.conflicts = FALSE)
mtcars
str(mtcars) # 데이터의 구조 파악
filter(mtcars, cyl==4) # 데이터에 필터 조건 설정
filter(mtcars, cyl==6 & mpg>20)
arrange(mtcars, wt, desc(hp)) # 정렬
head(arrange(mtcars, mpg, desc(wt))) # 정렬 후 앞 5행 출력
select(mtcars, mpg, cyl, carb)
# 오류 나는 경우는 다른 패키지 함수 사용하기 때문
# dplyr::select(mtcars, mpg, cyl, carb) 로 dplyr 패키지 명시해서 사용할 것
head(select(mtcars, am, gear))
결과
> mtcars
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
>
> str(mtcars)
'data.frame': 32 obs. of 11 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
$ disp: num 160 160 108 258 360 ...
$ hp : num 110 110 93 110 175 105 245 62 95 123 ...
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
$ wt : num 2.62 2.88 2.32 3.21 3.44 ...
$ qsec: num 16.5 17 18.6 19.4 17 ...
$ vs : num 0 0 1 1 0 1 0 1 1 1 ...
$ am : num 1 1 1 0 0 0 0 0 0 0 ...
$ gear: num 4 4 4 3 3 3 3 4 4 4 ...
$ carb: num 4 4 1 1 2 1 4 2 2 4 ...
>
> filter(mtcars, cyl==4)
mpg cyl disp hp drat wt qsec vs am gear carb
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
> filter(mtcars, cyl==6 & mpg>20)
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
>
> arrange(mtcars, wt, desc(hp))
mpg cyl disp hp drat wt qsec vs am gear carb
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
>
> head(arrange(mtcars, mpg, desc(wt)))
mpg cyl disp hp drat wt qsec vs am gear carb
Lincoln Continental 10.4 8 460 215 3.00 5.424 17.82 0 0 3 4
Cadillac Fleetwood 10.4 8 472 205 2.93 5.250 17.98 0 0 3 4
Camaro Z28 13.3 8 350 245 3.73 3.840 15.41 0 0 3 4
Duster 360 14.3 8 360 245 3.21 3.570 15.84 0 0 3 4
Chrysler Imperial 14.7 8 440 230 3.23 5.345 17.42 0 0 3 4
Maserati Bora 15.0 8 301 335 3.54 3.570 14.60 0 1 5 8
>
> select(mtcars, mpg, cyl, carb) # 오류 날 시 다른 패키지 함수 사용하는 것. dplyr::select(mtcars, mpg, cyl, carb) 로 dplyr 패키지 명시해서 사용할 것
mpg cyl carb
Mazda RX4 21.0 6 4
Mazda RX4 Wag 21.0 6 4
Datsun 710 22.8 4 1
Hornet 4 Drive 21.4 6 1
Hornet Sportabout 18.7 8 2
Valiant 18.1 6 1
Duster 360 14.3 8 4
Merc 240D 24.4 4 2
Merc 230 22.8 4 2
Merc 280 19.2 6 4
Merc 280C 17.8 6 4
Merc 450SE 16.4 8 3
Merc 450SL 17.3 8 3
Merc 450SLC 15.2 8 3
Cadillac Fleetwood 10.4 8 4
Lincoln Continental 10.4 8 4
Chrysler Imperial 14.7 8 4
Fiat 128 32.4 4 1
Honda Civic 30.4 4 2
Toyota Corolla 33.9 4 1
Toyota Corona 21.5 4 1
Dodge Challenger 15.5 8 2
AMC Javelin 15.2 8 2
Camaro Z28 13.3 8 4
Pontiac Firebird 19.2 8 2
Fiat X1-9 27.3 4 1
Porsche 914-2 26.0 4 2
Lotus Europa 30.4 4 2
Ford Pantera L 15.8 8 4
Ferrari Dino 19.7 6 6
Maserati Bora 15.0 8 8
Volvo 142E 21.4 4 2
>
> head(select(mtcars, am, gear))
am gear
Mazda RX4 1 4
Mazda RX4 Wag 1 4
Datsun 710 1 4
Hornet 4 Drive 0 3
Hornet Sportabout 0 3
Valiant 0 3
-데이터 추가 및 중복 제거
mutate(mtcars, year="1974") # 변수명 : year를 새로 생성해 값 1974를 넣는다
mutate(mtcars, mpg_rank=rank(mpg)) # 변수명 : mpg_rank로 순위 매긴다
distinct(mtcars, cyl) # 중복 제거
distinct(mtcars, cyl, gear) # or 조건으로 중복 제거
결과
> mutate(mtcars, year="1974") # 변수명 : year를 새로 생성해 값 1974를 넣는다
mpg cyl disp hp drat wt qsec vs am gear carb year
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 1974
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 1974
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 1974
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 1974
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 1974
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 1974
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 1974
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 1974
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 1974
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 1974
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4 1974
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3 1974
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3 1974
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3 1974
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4 1974
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4 1974
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4 1974
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1 1974
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2 1974
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1 1974
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 1974
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2 1974
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2 1974
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4 1974
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2 1974
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1 1974
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2 1974
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2 1974
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4 1974
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6 1974
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8 1974
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2 1974
>
> mutate(mtcars, mpg_rank=rank(mpg)) # 변수명 : mpg_rank로 순위 매긴다
mpg cyl disp hp drat wt qsec vs am gear carb mpg_rank
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 19.5
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 19.5
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 24.5
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 21.5
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 15.0
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 14.0
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 4.0
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 26.0
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 24.5
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 16.5
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4 13.0
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3 11.0
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3 12.0
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3 7.5
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4 1.5
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4 1.5
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4 5.0
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1 31.0
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2 29.5
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1 32.0
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 23.0
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2 9.0
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2 7.5
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4 3.0
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2 16.5
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1 28.0
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2 27.0
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2 29.5
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4 10.0
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6 18.0
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8 6.0
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2 21.5
>
> distinct(mtcars, cyl) # 중복 제거
cyl
Mazda RX4 6
Datsun 710 4
Hornet Sportabout 8
>
> distinct(mtcars, cyl, gear) # or 조건으로 중복 제거
cyl gear
Mazda RX4 6 4
Datsun 710 4 4
Hornet 4 Drive 6 3
Hornet Sportabout 8 3
Toyota Corona 4 3
Porsche 914-2 4 5
Ford Pantera L 8 5
Ferrari Dino 6 5
-데이터 요약 및 샘플 추출
summarise(mtcars, cyl_mean=mean(cyl), cyl_min=min(cyl), cyl_max=max(cyl))
gr_cyl <- group_by(mtcars, cyl) # mtcars 데이터 셋을 cyl 기준으로 group_by
summarise(gr_cyl, n()) # gr_cyl 데이터 셋에서 cyl 데이터 별 n() : 빈도수
summarise(gr_cyl, n(), n_distinct(gear)) # gear 중복 값을 제외하고 cyl별 개수 요약
sample_n(mtcars, 10) # 10개 샘플 추출
sample_frac(mtcars, 0.2) # 20% 샘플 추출
결과
> summarise(mtcars, cyl_mean=mean(cyl), cyl_min=min(cyl), cyl_max=max(cyl))
cyl_mean cyl_min cyl_max
1 6.1875 4 8
> gr_cyl <- group_by(mtcars, cyl) # mtcars 데이터 셋을 cyl 기준으로 group_by
> summarise(gr_cyl, n()) # gr_cyl 데이터 셋에서 cyl 데이터 별 n() : 빈도수
# A tibble: 3 x 2
cyl `n()`
<dbl> <int>
1 4 11
2 6 7
3 8 14
> summarise(gr_cyl, n(), n_distinct(gear)) # gear 중복 값을 제외하고 cyl별 개수 요약
# A tibble: 3 x 3
cyl `n()` `n_distinct(gear)`
<dbl> <int> <int>
1 4 11 3
2 6 7 3
3 8 14 2
> sample_n(mtcars, 10) # 10개 샘플 추출
mpg cyl disp hp drat wt qsec vs am gear carb
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
> sample_frac(mtcars, 0.2) # 20% 샘플 추출
mpg cyl disp hp drat wt qsec vs am gear carb
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
-%>%(파이프) 연산자
불필요 변수를 생성하지 않아 좋다.
gr_cyl <- group_by(mtcars, cyl)
summarise(gr_cyl, n())
# group_by(mtcars, cyl) %>% summarize(n())
# mtcars %>% group_by(cyl) %>% summarize(n())
mutate(mtcars, mpg_rank=rank(mpg))
arrange(mp_rank, mpg_rank)
# mutate(mtcars, mpg_rank=rank(mpg)) %>% arrange(mpg_rank)
# mtcars %>% mutate(mpg_rank=rank(mpg)) %>% arrange(mpg_rank)
'R' 카테고리의 다른 글
섹션 10. Chapter 10 ggplot2 패키지 (Youtube HelloJany) (31) | 2022.09.08 |
---|---|
섹션 8. Chapter 08 KoNLP 패키지 (Youtube HelloJany) (0) | 2022.09.08 |
섹션 7. Chapter 07 reshape2 패키지 (Youtube HelloJany) (0) | 2022.09.08 |
섹션 6. Chapter 06 패키지 (Youtube HelloJany) (0) | 2022.09.07 |
섹션 5. Chapter 05 데이터 가공 (Youtube HelloJany) (0) | 2022.09.07 |