R 기초 벡터 vector 사용법 , paste(문자열 붙이기) ,nchar(문자열세기), substr(문자열자르기), strsplit(하위 문자열 분리)

  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

nchar에서 문자열을 셀 때,  공백도 같이 세니까? 주의 하여야 한다. 

문자열을 붙일 때는 paste() 함수를 이용해서 문자열을 센다. 
 
 text1 <- c("avante")
 text2 <- c("N line")
 paste(text1, text2)
## [1] "avante N line"

 즉 text1과 text2를 조합 한 것이다.  이것은 일반적으로 표현 할 때 쓰는 것이고,  아래와 같이 이름을 표현 할때는 어떻게 할까?

# 이름 붙이기 
 성 = "홍"
 이름 = "길동"
 
  paste(성, 이름)
## [1] "홍 길동"
# 공백 없이 붙이기  
  paste0(성, 이름)
## [1] "홍길동"

위와 같이 paste()를 쓰면,  공백 하나가 생기고,  paste0()를 사용하면 공백이 없이 붙는다. 

  어떠한 물건을 생산 하였다 가정 하자,   상품번호를 시리얼하게 만드는데,   R에서는 아주 간단한 명령어로 시리얼 하게 붙일 수 있다. 


 차량 번호 붙이기 
  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"

위와 같이 2가지를 선택 할 수 있는데,  paste0()을 이용해서,  시리얼 하게 붙이는 방법하고,  이것보다는 보기 좋은 방법으로  paste() 에 sep ="-" 옵션을 사용하여, "-"을 중간에 붙일 수 있다. 


3. 문자열 추출 및 문자열 분리 

 문자열을 추출 할 때는 당연히  날짜를 핸들링 할 때,  많이 사용된다.  R을 처음 진입해서 모델을 만들고,  데이터 베이스에 월하고, 년도를 올려야 하는데,  나는 아래와 같이 데이터를 만들었다.
 
  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

7월 인 경우에는 7이 나왔고, 10월인 경우에는 10이 나왔다.  보통 데이터를 넣을때,  소팅 문제 때문에  2자리를 넣는다.   두자리를 넣지 않는 다면 소팅 할때,  아래와 같은 문제가 생긴다. 

     소팅 전 :  1, 2, 3, 4, 5, 6, 7, 8 ,9 ,10, 11, 12
     소팅 후 :  1, 10, 11, 12, 2, 3, 4, 5, 6, 7, 8, 9

그래서 아래와 같이  substr을 이용해서 2자리로 만든다. 

# substr로 년 만들기 
  substr(Date, 1,4)
## [1] "2021"
# substr로 월 만들기 
  substr(Date, 6,7)
## [1] "07"


문자열 분리는 아래와 같은 데이터를 지게차 톤수별로 관리 하고 싶은 경우가 있다. 
그러면 아래와 같이 분리 하면 된다. 

 strsplit 를 사용하면 아래와 같이 대괄호가 나타내는 위치를 가져오면 된다. 

# 지게차 데이터 
  fl <- c("fork lift 5TON")

  strsplit(fl, split = " ")
## [[1]]
## [1] "fork" "lift" "5TON"
  fl_split <-  strsplit(fl, split = " ")
  fl_split[[1]][3] 
## [1] "5TON"

   이런 방식으로 해서, 데이터를 분리 한 다음,  데이터 프레임에 직접 넣는다. 

댓글 없음:

댓글 쓰기

css cheat sheet 클래스 선택자, margin(마진), display , center 조정 간단한 구성 요소

 앞에서는 html의 간단한 sheet를 소개 하였습니다.   html은  주로 골격을 나타나는 것이라, 디자인을 하는데는 css로 하여야 합니다.  아래 코드와 같이 css 관련 하여 매우 간단하게 코딩 하겠습니다.  body 부분의 css 코딩  ...