R-Studio 정규식과 paste 함수

R-Studio의 정규식과 여러 string 함수를 사용 하여 문제를 풀어보기

Featured image

사용 예시 소스코드

# 다음의 data 객체를 대상으로 문제에 맞게 정규 표현식을 적용하여 문자열을 처리하시오.

data <- c("2017-02-05 수입3000원", "2017-02-06 수입4500원", "2017-02-07 수입2500원")
data

# 문제01) 날짜별 수입을 다음과 같이 출력하시오.
# 출력) "3000원" "4500원" "2500원"
regEx <- "[0-9]{1,}원" 
price <- unlist(str_extract_all(data, regEx))
price

# 문제02) 위 벡터에서 연속하여 2개 이상 나오는 모든 숫자를 제거하시오.
# 출력) "-- 수입원" "-- 수입원" "-- 수입원"
regEx <- "[0-9]{2,}" 
price <- unlist(str_remove_all(data, regEx))
price

# 문제03) 위 벡터에서 -를 /로 치환하세요.
# 출력)
# "2017/08/08 수입3000원"
regEx <- '-'
price <- unlist(str_replace_all(data, pattern = regEx, replacement = '/'))
price

# 문제04) 모든 원소를 쉼표(,)에 의해서 하나의 문자열로 합치시오.
# 출력 결과) "2017-02-05 수입3000원,2017-02-06 수입4500원"
price <- paste(data, collapse = ",")
price

# 다음 문자열을 정규 표현식을 이용하여 풀어 보세요.
# 문자열에서 소괄호 안의 수치는 1개당 단가이다.
# str1 <- '사과 3(1000)개, 밤 5(500)개, 배 4(2000)개만 주세요.'
#
# 출력 결과
# 총 구입 갯수 : 12개
# 총 판매 금액 : 13500원
# ------------------------------------------------------------------------------------------------------
str1 <- '사과 3(1000)개, 밤 5(500)개, 배 4(2000)개만 주세요.'

regQty <- "\\s[0-9]{1}" 
regPrice <- "\\([0-9]{1,}\\)"
regPrice2 <- "[0-9]{1,}"
qty <- unlist(str_extract_all(str1, regQty))
price <- unlist(str_extract_all(str1, regPrice))
price <- unlist(str_extract_all(price, regPrice2))
price

cat("총 구입 갯수 :",sum(as.numeric(qty)), "개")
cat("총 판매 금액 :",sum(as.numeric(price)*as.numeric(qty)), "원")

# 다음과 같은 주소지 정보가 있다.
# 마지막 번지와 관련된 정보를 추출하고자 한다.
# 
# mydata <- c('강원원주시웅비2길8', '강원도철원군서면와수로181번길7-16', '강원평창군봉평면태기로68', '강원강릉시강변로410번길36')
# 
# 출력 결과
# 2길8
# 181번길7-16
# 68
# 410번길36
# ------------------------------------------------------------------------------------------------------
mydata <- c('강원원주시웅비2길8', '강원도철원군서면와수로181번길7-16', '강원평창군봉평면태기로68', '강원강릉시강변로410번길36')
# reg <- "[0-9]{1,}([가-힣]{1,})?[0-9]{1,}(-?[0-9]{1,})?"
reg <- "\\d"
loc <- str_locate(mydata, reg)
address <- str_sub(mydata, loc[1:nrow(loc)], str_length(mydata))
address

# 다음 항목들 중에서 올바른 이메일 주소들만 정규 표현식을 이용하여 아이디와 메일 주소를 추출하세요.
# 메일 주소의 id는 반드시 알파벳 소문자로 시작해야 한다.
# id는 반드시 4글자 이상이어야 한다.
# mydata <- c('abcd@naver.com', '1aaa@daum.net', 'xyz1@daum.net', 'xyz@daum.net')
# 
# 출력 결과
# 아이디 : abcd, 메일 종류 : naver.com
# 아이디 : xyz1, 메일 종류 : daum.net
# ------------------------------------------------------------------------------------------------------
mydata2 <- c('abcd@Naver.com', '1aaa@daum.net', 'xyz1@dau3m.net', 'xyz@daum.net')
regID <- "^[a-z]\\w{3,}@\\w{1,}.\\D{1,}"
ids <- unlist(str_extract_all(mydata2, regID))
ids

for (str in ids) {
  id <- unlist(str_split(str, '@'))
  cat("아이디 : ",paste(id[1], ','), " 메일 종류 : ",id[2],"\n")
}

# 다음 제시하는 벡터 somedata는 '입사년도이름급여'순으로 사원의 정보가 기록된 데이터이다. 
# 이 벡터 데이터를 이용하여 다음과 같은 출력 결과가 나타나도록 함수를 정의하시오.
# 
# somedata <- c("2002홍길동220", "1970이순신300", "1980유관순260")
# 
# <출력 결과>
# 전체 급여 평균 : 260
# 평균 이상 급여 수령자
# 
# 이순신 => 300
# 유관순 => 260
# 
# 힌트) 사용 함수
# stringr 패키지 : str_extract(), str_replace() 함수
# 숫자 변환 함수 : as.numeric() 함수

somedata <- c("2002홍길동220", "1970이순신300", "1980유관순260")


getData <- function( vec ) {
  
  reg <- "[0-9]{3,}|[가-힣]{1,}"
  data <- unlist(str_extract_all(vec, reg))

  userMat <- matrix(data, ncol = 3, byrow = T)
  userDat <- data.frame(userMat)
  colnames(userDat) <- c("입사년도", "이름", "급여")
  userDat$급여 <- as.numeric(as.character(userDat$급여))
  
  avgSalary <- mean(userDat$급여)
  avgOverUser <- userDat[userDat$급여>=avgSalary, ]
  
  cat("전체 급여 평균 : ",avgSalary)
  cat("\n")
  cat("평균이상 급여 수령자\n")
  cat("============================\n")
  avgOverUser
}

getData(somedata)