R실무를 하면서, 문자열, paste, nchar, substr, strsplit, grep 및 정규화 표현식은 많이 사용되어 진다. 아래와 같이 위 함수를 정의한다.
- paste : 문자형 벡터에서 문자열을 붙일 때 사용한다.
- nchar : 문자형 벡터에서 문자열을 셀 때 사용한다.
- substr : 문자형 벡터에서 부분 문자열을 추출하거나 교체 한다.
- strsplit : 문자형 벡터에서 하위 문자열을 분리 한다.
만약에 위의 명령어를 사용하지 못한 다면, R의 데이터 전처리 할때, 어떻게 해야 할지 몰라, 그냥 엑셀에서 전처리를 전부 하고, R에서는 모델링을 하게 된다. 어떠한 책을 보더라도, 이 부분이 있다는 것을 설명 할 뿐 어떻게 사용하는지 알 수 없다.
R vector 사용법 |
예전에 네이버 지식인에서 이러한 질문이 왔었다.
- 코드가 200번이나 201번 일 때 분류코드는 4자리가 되어야 함
- 분류코드가 3자리인 경우 앞에 0을 붙여 4자리고 만든다.
- 상품 코드가 490 이나 491일 경우 분류코드가 7자리가 되어야 한다.
내용을 요약하면 아래와 같다. 관련된 링크는 아래와 같다.
https://rdmkyg.blogspot.com/2021/06/r-nchar.html
이런 것은 아주 흔하다. 물론 이런 것들은 엑셀에서 잘 지원이 되는데, 엑셀 사용을 잘 한다면, 엑셀에서 해도 무방하다. 하지만 데이터 갯수가 천만개 정도 되면 이야기가 전혀 다르다.
어찌 되었든 문단을 나누어 진행 할 것이다.
1. 문자 벡터 특성
문자열을 초기화 하려면 '<-'를 사용해서 문자열을 대입 한다. 빈 문자열을 초기화 하는 경우 x <- "" 로 하거나 character 함수로 지정 한다.
아래는 빈 문자열을 작성 하거나, NA로 초기화 하거나, NULL 로 초기화 하거나, 0으로 초기화 하였을 경우에 나타내는 것이다.
# 빈 문자열 작성
x <- character(1)
x
## [1] ""
is.character(x)
## [1] TRUE
# 위와 같음
x <- ""
x
## [1] ""
is.character(x)
## [1] TRUE
위의 예제는 빈 문자열을 작성 하였을 경우이다. character(1)와 , ""로 하나 결과는 같다.
만약에 NA 나 NULL 값을 입력 하였을 경우에는 다르다. 아래 예제는 서로 다름을 알 수 있다.
# NA 로 초기화
x <- NA
x
## [1] NA
is.na(x)
## [1] TRUE
# NULL 초기화 ( TRUE, FALSE, 미정 (undefinend) 값을 표현
x <- NULL
x
## NULL
is.null(x)
## [1] TRUE
# 0으로 초기화
x <- 0
x
## [1] 0
is.double(x)
## [1] TRUE
is.integer(x)
## [1] FALSE
R에서는 공백, "", NA, 'NA' 값을 달리 인식을 한다. 아래와 같이 데이터 프레임을 만들어 놓고, 차이점을 살펴 보자.
# 삼성전자 등락률 "최근 10일"
날짜 = c("20210714", "20210713", "20210712", "20210707","20210708",
"20210707", "20210706", "20210705", "20210702","20210701")
종가 = c(79500, 79800, 79700, 79400, 79900,
80800, 81200, 80400, 80000, 80100)
stock <- data.frame(날짜, 종가, 종목 = "삼성전자")
library(dplyr)
# stock 데이터를 df로 대입
df <- stock
# 데이터 프레임의 종목 2번재열 3번째 열을 인위적으로 바꾼다면
df$종목[2] <- NA
df$종목[3] <- ""
df$종목[4] <- 'NA'
df
## 날짜 종가 종목
## 1 20210714 79500 삼성전자
## 2 20210713 79800 <NA>
## 3 20210712 79700
## 4 20210707 79400 NA
## 5 20210708 79900 삼성전자
## 6 20210707 80800 삼성전자
## 7 20210706 81200 삼성전자
## 8 20210705 80400 삼성전자
## 9 20210702 80000 삼성전자
## 10 20210701 80100 삼성전자
위와 같이 2번째 열, 3번째 열, 4번째 열 모두 다르다. 이것을 RStudio View()로 아래와 같이 보인다.
데이터 View로 보기 |
# NA 항목 조회
df %>%
filter(is.na(종목))
## 날짜 종가 종목
## 1 20210713 79800 <NA>
# "" 으로 조회
df %>%
filter(종목 == "")
## 날짜 종가 종목
## 1 20210712 79700
# 'NA' 으로 조회
df %>%
filter(종목 == "NA")
## 날짜 종가 종목
## 1 20210707 79400 NA
NA 은 is.na() 로 조회해야 데이터가 출력되고, ""은 종목 == "" 으로 조회 하여야 하며,
'NA'는 종목 == "NA"로 하여야 한다.
잘 정리되지 않은 엑셀 데이터를 import할때, 이런 헤깔림이 있다.
2. 문자열 세기 및 붙이기
# 문자열 세기
text <- c("avante")
nchar(text)
## [1] 6
text <- c("avante N line")
nchar(text)
## [1] 13
text1 <- c("avante")
text2 <- c("N line")
paste(text1, text2)
## [1] "avante N line"
# 이름 붙이기
성 = "홍"
이름 = "길동"
paste(성, 이름)
## [1] "홍 길동"
# 공백 없이 붙이기
paste0(성, 이름)
## [1] "홍길동"
차량 번호 붙이기
paste0("avante", 1001:1050)
## [1] "avante1001" "avante1002" "avante1003" "avante1004" "avante1005"
## [6] "avante1006" "avante1007" "avante1008" "avante1009" "avante1010"
## [11] "avante1011" "avante1012" "avante1013" "avante1014" "avante1015"
## [16] "avante1016" "avante1017" "avante1018" "avante1019" "avante1020"
## [21] "avante1021" "avante1022" "avante1023" "avante1024" "avante1025"
## [26] "avante1026" "avante1027" "avante1028" "avante1029" "avante1030"
## [31] "avante1031" "avante1032" "avante1033" "avante1034" "avante1035"
## [36] "avante1036" "avante1037" "avante1038" "avante1039" "avante1040"
## [41] "avante1041" "avante1042" "avante1043" "avante1044" "avante1045"
## [46] "avante1046" "avante1047" "avante1048" "avante1049" "avante1050"
# 차량 번호 "-" 표시하면서 붙이기
paste("avante", 1001:1050, sep = "-")
## [1] "avante-1001" "avante-1002" "avante-1003" "avante-1004" "avante-1005"
## [6] "avante-1006" "avante-1007" "avante-1008" "avante-1009" "avante-1010"
## [11] "avante-1011" "avante-1012" "avante-1013" "avante-1014" "avante-1015"
## [16] "avante-1016" "avante-1017" "avante-1018" "avante-1019" "avante-1020"
## [21] "avante-1021" "avante-1022" "avante-1023" "avante-1024" "avante-1025"
## [26] "avante-1026" "avante-1027" "avante-1028" "avante-1029" "avante-1030"
## [31] "avante-1031" "avante-1032" "avante-1033" "avante-1034" "avante-1035"
## [36] "avante-1036" "avante-1037" "avante-1038" "avante-1039" "avante-1040"
## [41] "avante-1041" "avante-1042" "avante-1043" "avante-1044" "avante-1045"
## [46] "avante-1046" "avante-1047" "avante-1048" "avante-1049" "avante-1050"
3. 문자열 추출 및 문자열 분리
Date <- as.Date("2021-07-05")
# 라이브러리 로딩
library(lubridate)
year(Date)
## [1] 2021
month(Date)
## [1] 7
Date1 <- as.Date("2021-10-05")
month(Date1)
## [1] 10
# substr로 년 만들기
substr(Date, 1,4)
## [1] "2021"
# substr로 월 만들기
substr(Date, 6,7)
## [1] "07"
# 지게차 데이터
fl <- c("fork lift 5TON")
strsplit(fl, split = " ")
## [[1]]
## [1] "fork" "lift" "5TON"
fl_split <- strsplit(fl, split = " ")
fl_split[[1]][3]
## [1] "5TON"
댓글 없음:
댓글 쓰기