ACAIT

[R] 빅데이터 실무 분석 3차시_사용자 정의 함수, 조건문, 반복문, 정규식, 문자열, stringr() 본문

전공 및 코드/R프로그래밍

[R] 빅데이터 실무 분석 3차시_사용자 정의 함수, 조건문, 반복문, 정규식, 문자열, stringr()

831x99 2023. 6. 28. 12:52
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
### section 03_사용자 정의 함수와 조건문과 반복문
 
# R은 한 줄씩 인식. 인터프리터 언어. 엔터 중요.
# 사용자 정의 함수가 객체, 캡슐화 -> R도 객체 지향 언어.
 
### 1) 사용자 정의 함수 이해하기
# 함수이름 = function(매개변수){
#   규칙 return (결과값)
# }
 
myf_1 = function(a,b){
  return(a*b) 
  # 다른 변수 저장 않고 바로 리턴 가능
}
myf_1(2,3)
 
myf_2 = function(a){
  result = a^2
  # a^2 == a**2
  cat('제곱한 결과값은',result)
}
myf_2(5)
# GlobalEnv: 전역 환경, 전역에서 사용할 수 있는 함수
 
 
### 2) 조건문 이해하기
# 단순조건분기(조건 하나), 다중조건분기(조건 多)
# 참과 거짓 판단하는 부분이 조건분기.
# ==, !=, >=, >, <=, < 연산자로 분기하는 것.
# 중괄호 안에 있는 코드들 -> 코드 블럭
 
# 단순조건분기
= 6
 
if(x > 5) {print(1)} else {print(0)}
 
if(x%%3 == 0){
  y = x^2
  print(y)
else{
  y = x*0
  print(y)
}
 
# ifelse(조건, 참 반환, 거짓 반환)
if_ex3 = function(x) {
  ifelse(x%%3 == 0, x^2, x*0
}
if_ex3(12)
 
 
# 다중조건분기
# if ~ else if ~ else문 사용하기
fruits = function(x){
  if(x == '사과')    {print("Good")}
  else if(x == '감') {print("Very Good")}
  else if(x == '귤') {print("Soso")}
  else {print("다시 입력")}
}
fruits('사과')
fruits('망고')
 
# 조건 2개 이상
# != -> Not. 아닐 경우 참
not_ex1 = function(x){ 
  if(x!=0){
    print("만나기 싫다")
  } else{
    print("만나고 싶다")
  }
}
not_ex1(1)
 
# & && -> And
amp_ex1 = function(a,b){
  if((a>5& (b>5)){
    c = a+b
    return(c)
  } else{
    c = a*b
    return(c)
  }
}
amp_ex1(6,7)
 
# | || -> Or
bar_ex1 = function(x,y){
  if((x<0| (y<0)){
    z = x+y
    return(z)
  } else{
    z = x*y
    return(z)
  }
}
bar_ex1(-1,-2)
 
# return을 쓰면 다른 코드가 해당 반환값을 받아서 사용할 수 있음. 
# 추가 코드가 없다면 return과 print 둘 다 값 반환, 출력 역할만 하므로 동일.
 
 
### 3) 반복문 이해하기
# while문 -> 무한 루프. 
while_ex1 = function(x){
  no = 1 # 변수 초기화
  while(x >= no){
    print(no)
    no = no + 1
  }
}
while_ex1(4)
 
while_ex2 = function(x){
  hap = 0
  no = 1
  while(x >= no){
    hap = hap + no
    no = no + 1
  }
  print(hap)
}
while_ex2(3)
 
# break문: 특정 조건 해당 시 반복문 탈출
# next문: 특정 조건이면 건너뛰기
 
 
# for문 -> 범위 range가 있음.
# 순차 대입 반복 수행문
# for(변수 in 범위시작:범위끝)
for(i in 1:5){ cat('번호는',i,'\n')}
 
for_ex1 = function(x){
  for(i in 1:x){print(i)}
}
for_ex1(3)
 
for_ex2 = function(x){
  hap = 0
  for(i in 1:x){
    hap = hap + i
  }
  print(hap)
}
for_ex2(10)
for_ex2(100)
 
 
### 04_R활용 텍스트 분석
### section 03_R을 활용한 한글/영어 텍스트 분석
 
# 텍스트 마이닝에 많이 사용되는 패키지는 koNLP(), tm()
 
# 정규식: 특징 추출할 때 쓰는 기호
# \\d: 숫자인 것
# \\D: 숫자가 아닌 것
# ^(carrot): 시작되는 글자 지정
# $: 마지막 글자 지정
# |: 두 개 이상 조건 동시 지정
# [ab]: a 또는 b, [^ab] a 또는 b를 제외한 모든 것(캐롯 위치에 따라 달라짐.)
# [0-9], [A-Z], [a-z], [A-z]
 
# grep(): 주어진 조건만 골라내는 함수
t_ex1 = c('apple','year2023','247','사과','153pen''Hello R')
t_ex1
 
grep('[A-z]', t_ex1, value = T)
grep('[가-힣]', t_ex1, value = T)
grep('[0-9]', t_ex1, value = T)
 
# [ab] -> a 또는 b
# [^ab] -> a 또는 b 제외 나머지
# ^[ab] -> a 또는 b로 시작
# ^[^ab] -> a 또는 b 제외 나머지로 시작
grep('[A-z0-9]', t_ex1, value = T) 
grep('[^A-z0-9]', t_ex1, value = T) 
grep('^[A-z가-힣]', t_ex1, value = T) 
grep('^[^A-z가-힣]', t_ex1, value = T)
 
# 숫자만, 영어만, 모든 문자 출력
grep('[[:digit:]]', t_ex1, value = T)
grep('[:alpha:]', t_ex1, value = T)
grep('[[:alpha:]]', t_ex1, value = T)
 
# 영어와 숫자 출력
# 모든 문자와 숫자 출력
# 문자열 안에 공백
grep('[:alnum:]', t_ex1, value = T)
grep('[[:alnum:]]', t_ex1, value = T)
grep('[[:blank:]]', t_ex1, value = T)
 
# p+: p 최소 1개, p{2}: p 2개 이상
grep('p+', t_ex1, value = T)
grep('p{2}', t_ex1, value = T)
 
 
# nchar(): 글자의 개수, 길이 반환
nchar_ex1 = "배 고 파 요"
nchar(nchar_ex1) # 결과 -> 7
 
nchar_ex2 = c('a.txt''A.txt''abc.txt')
nchar(nchar_ex2) # 5 5 7
 
 
# paste(): 여러 단어나 문장을 합치는 함수
# collapse='|' -> 찾고 싶은 조건 여러 가지 한 번에 검색 가능
# sep='' -> 구분자 변경 가능 (default 공백)
paste(1,2,3# 1 2 3
paste(1,2,3,sep=''# 123
paste(1,2,3,sep='-'# 1-2-3
 
 
# substr(): 특정 위치 잘라내는 함수
substr('991001'14# 9910
 
 
# strsplit(): 특정 기호로 분리하기
t_ex2 = c('031-123-4567'
          '042-565-5557',
          '051-222-5686',
          '031-222-5696')
strsplit(t_ex2, "-")
# [[1]]
# [1] "031"  "123"  "4567"
 
# [[2]]
# [1] "042"  "565"  "5557"
 
# [[3]]
# [1] "051"  "222"  "5686"
 
# [[4]]
# [1] "031"  "222"  "5696"
 
# 리스트 형식으로 반환됨을 확인
class(strsplit(t_ex2, "-")) 
 
# 리스트 해체하고 집계하기
table(unlist(strsplit(t_ex2, "-")))
 
# 국번만 분리
substr(t_ex2, 13)
 
# 국번만 집계
table(substr(t_ex2, 13))
 
 
# stringr() 패키지와 주요 함수
install.packages("stringr")
library("stringr")
 
t_ex3 = c('사과''수박''수박수박''애플수박''당근')
 
stringr::str_replace(t_ex3, '수박''망고')
# 문자열의 첫 단어만 치환
 
stringr::str_replace_all(t_ex3, '수박''망고')
# 문자열의 모든 단어 치환
cs