R 수열 ( seq, rep, 요인) 수준 생성

  R의 가장 기초적인 부분은 seq(수열), req(반복)을 주로 다루겠다. 

R실무 할 때,  상상 외로,  기초 부분을 많이 다룬다.   하지만,   대부분의 사람들을  기초를 배우는데도 불구하고, 실무에서는 어디에 사용하는지 모르고,  접근 하는 경우가 매우 많다.  아래는 기초적인 내용과,  실무 사례의 예를 들어서 설명 할 예정 이다. 

3.3 수열 생성

벡터를 만드는 중요한 방법은 수열(sequence)을 생성하는 것입니다. 가장 간단한 수열은 1만 있는 경우이며 콜론 연산자를 사용해 간단하게 수열을 생성 할 수 있다. 즉 콜론에 의해 구분되는 첫번째와 마지막값을 설정 하기만 하면 됩니다. 0에서 10까지 수열은 다음과 같습니다.

0:10
##  [1]  0  1  2  3  4  5  6  7  8  9 10

15부터 5까지 수열은 아래와 같습니다.

15:5
##  [1] 15 14 13 12 11 10  9  8  7  6  5


증감 단계가 1이 아닌 수열을 생성하려면 seq 함수를 사용해야 합니다. seq함수를 사용하기 위한 다양한 형태중 가장 간단한 형태는 3개의 매개변수인 from, to, by(초기값, 최종값, 증분값)으로 구성됩니다. 초기값이 최종값보다 작다면 중분값은 아래와 같이 양수로 존재합니다.

seq(0, 1.5, 0.1)
##  [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5


초기값이 최종값보다 크다면 중분값은 다음과 같이 음수여야 합니다.

seq(6,4,-0.2)
##  [1] 6.0 5.8 5.6 5.4 5.2 5.0 4.8 4.6 4.4 4.2 4.0


때로는 기존 벡터와 길이가 같은 수열을 만들어야 할때가 있습니다. R에서는 원하는 길이의 벡터를 생성하기 위해 시작값에서 최종값까지 증분을 계산한는 것보다 along, length 옵션을 사용하는 경우가 많습니다.
인구 크기의 벡터가 다음과 같다고 가정 합시다.

N <- c(55,76,92,103,84,88,121,91,65,77,99)


0.04부터 0.01단계로 증가하는 x좌표에 대해 인구 크기를 그래프를 표시 한다고 하시죠.

seq(from= 0.04, by = 0.01, length =11)
##  [1] 0.04 0.05 0.06 0.07 0.08 0.09 0.10 0.11 0.12 0.13 0.14


이 경우 수열 N의 길이만큼 x좌표를 만들어야 합니다. 이를 위해서는 다음과 같이 along의 값으로 길이가 일치해야 하는 벡터 N을 설정 합니다.

seq(0.04, by=0.01, along=N)
##  [1] 0.04 0.05 0.06 0.07 0.08 0.09 0.10 0.11 0.12 0.13 0.14

다른 방법으로는 from = 시작값, to = 종료값, along = 일치해야 하는 길이를 갖는 벡터명을 설정해 해당 증분을 계산 합니다.

seq(from = 0.04, to=0.14, along=N)
##  [1] 0.04 0.05 0.06 0.07 0.08 0.09 0.10 0.11 0.12 0.13 0.14


이옵션의 중요한 활용 분야는 모형으로 부터 예측값을 사용해 해당 데이터의 산점도 영역 전체에 대해 부드러운 선을 그리기 위한 x값을 얻는 것입니다.

증분 결과가 최종값과 일치 하지 않는 경우, 최종값을 넘지 않는 범위까지 수열이 생성됩니다.

seq(1.4,2.1,0.3)
## [1] 1.4 1.7 2.0


서로 다른 길이의 수열로 이루어진 벡터를 원한 다면 sequence 함수를 사용합니다. 5개의 문자열 수열의 대부분 1에서 4까지이지만 두 번째는 1에서 3까지, 그리고 마지막은 1에서 5까지로 생성한다고 가정 합니다.

sequence(c(4,3,4,4,5))
##  [1] 1 2 3 4 1 2 3 1 2 3 4 1 2 3 4 1 2 3 4 5



예제 1

조선소에서 사용하는 용접기는 RST 3상에 의해 1차 전압, 전류가 공급이 됩니다. RST 값을 seq값으로 나열하고, 이것에 따른 그래프를 그리십시오.

# 정현파 sin
  x <- seq(0, 2*pi, by=pi/180) 
  
  r <- sin(x) 
  s <- sin(x + 180+0.1)   #x의 값이 1이 늘어나서 0.1씩조정
  t <- cos(x + 120+-0.1)  #x의 값이 1이 늘어나서 -0.1씩조정
  plot(r, type="l", ann = FALSE)
  lines(s, type = "l", col =2)
  lines(t, type ="l", col =4)
  grid()
  title(main="RST 3상")
  title(xlab = "t")
  title(ylab = "RST")

R plot RST 3상 




3.3.1 반복생성

종종 숫자나 문자의 반복이 필요한 경우 rep 함수를 사용합니다. 첫 번째 매개변수로 설정된 개체는 두번째 인자로 설정된 횟수만큼 반복된다. 간단히 숫자 9를 5회 반복하도록 합니다.

rep(9,5)
## [1] 9 9 9 9 9

rep 함수를 다양한 방법으로 적용한 예제를 실행한 후 결과를 비교해 봅시다.

rep(1:4, 2)
## [1] 1 2 3 4 1 2 3 4
rep(1:4, each =2)
## [1] 1 1 2 2 3 3 4 4
rep(1:4, each = 2, times =3)
##  [1] 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4


첫 번째 예제는 1에서 4까지 수열을 2번 반복합니다.. 수열의 각 요소를 반복하려면 두 번째 예제와 같이 매개 변수 each를 사용합니다. 마지막으로 각 숫자를 반복하고 전체 시리즈를 3회 반복하려면, 세번째 예제와 같이 each와 times를 사용합니다.

시리즈의 각 요소를 다른 회수 만큼 반복하려면 2개의 인자가 동일한 길이의 벡터가 되도록 해야 합니다. 1에서 4까지 1개의 2,3,개의 3,4개의 4로 구성된 값을 생성하는 코드는 다음과 같이 합니다.

rep(1:4,1:4)
##  [1] 1 2 2 3 3 3 4 4 4 4


복잡한 예제로, 첫 번째 인자의 각 요소를 불규칙하게 반복하고 싶다고 합시다. 예를 들어 4개의 1, 1개의 2, 4개의 3, 2개의 2를 생성하려면 연결 함수 c를 사용해 길이 4인 벡터를 c(4,1,4,2)로 생성하고 rep 함수의 대한 두 번째 인자로 사용합니다.

rep(1:4, c(4,1,4,2))
##  [1] 1 1 1 1 2 3 3 3 3 4 4


숫자 보다 문자 데이터를 대상으로 적용한 예제는 다음과 같으면 rep 함수는 일반적인 형태 입니다.

rep(c("cat","dog","gebii","goldfish","rat"),c(2,3,2,1,3))
##  [1] "cat"      "cat"      "dog"      "dog"      "dog"      "gebii"   
##  [7] "gebii"    "goldfish" "rat"      "rat"      "rat"


예제 2

어느 배달 대행 업체에서 오토바이 20대를 운영 하고 있다. 각 오토바이별로, 사람이 1:1로 배정되었으며, 개인의 일평균 가동시간이 주어졌다고 가정 합니다. 각 차량 번호별 월별로 가동시간이 얼마나 되는지 계획을 잡아 보십시오.



벡터를 이용해서 2개의 데이터 프레임을 만듭니다. 첫번째 데이터 프레임을 차량별 일평균 가동 시간 데이터이고, 두번째 데이터 프레임은 월간 일자 데이터 프레임 입니다.

# 차량 기본 정보 입력 하기 
# 차량번호 입력
  차량번호 <- c("MV0001","MV0002","MV0003","MV0004","MV0005",
                "MV0006","MV0007","MV0008","MV0009","MV0010",
                "MV0011","MV0012","MV0013","MV0014","MV0015",
                "MV0016","MV0017","MV0018","MV0019","MV0020")

# 가동시간 
  일평균_가동시간 <-c(9,6,7,9,8,7,9,6,10,8,6,
                      10,7,9,9,10,9,10,8,8)

# 차량번호별 가동 데이터 프레임 만들기 
  mv<-data.frame(차량번호, 일평균_가동시간) 

 
## 월간 시간 데이터 구하기 
# 월 데이터 입력  
  월<-c("01","02","03","04","05","06",
        "07","08","09","10","11","12")

  일수<-c(31,28,30,30,31,30,31,
          31,30,31,30,31)
 
# 월별 가동일수 데이터 프레임 만들기 
  cal<-data.frame(월,일수)


각 벡터를 data.frame() 함수를 묶어 mv(차량번호별 가동데이터), cal(월별 가동일수 데이터) 데이터 프레임을 만듦니다.

20대의 12개월의 가동계획을 만드니, 데이터 레코드 수는 240개 입니다. 즉 rep를 이용해서, 차량번호를 반복할 필요성이 있습니다. 예전 엑셀에서는 같은 것이 반복 되면, 손으로 띄워 놓은 다음에, 그걸 복사 하는 작업을 하였습니다.

물론 수작업은 장비의 댓수나 항목이 적었을때, 사용합니다. 하지만, 장비의 댓수가 50,000대 이상이면, 손으로 하는 것을 불가능 합니다. 아래와 같이 rep함수를 써서, 데이터를 만들어 봅시다.

# 차량을 12개월로 분할 하기 
  df<-data.frame(차량번호=rep(차량번호, each =12))
  df1<-cbind(df, 월)  
  head(df1)
##   차량번호 월
## 1   MV0001 01
## 2   MV0001 02
## 3   MV0001 03
## 4   MV0001 04
## 5   MV0001 05
## 6   MV0001 06
  nrow(df1)
## [1] 240

위와 같이 data.frame() 함수를 사용하고, req() each 옵션을 사용하면, 240개의 개의 데이터 레코드를 만들수 있습니다. 한꺼번에 1개의 설비가 12개가 반복해서 생성 된 것입니다.


그럼 다음에는 left_join() 함수를 이용하여, 일평균_가동시간과 월별 일수를 가져옵니다. left_join() 함수는 엑셀에서 사용하는 vlookup() 함수와 같이 필드 명과 필드의 값이 같으면 매칭이 됩니다. join 함수는 inner_join, left_join, right_join등 여러가지를 사용하지만, 사용하기 가장 편한 것은 left_join() 함수 입니다.


아래와 같이 차량별 일평균 가동시간을 가져옵니다.

# 패키지 dplyr  불러오기 
  require(dplyr)
## 필요한 패키지를 로딩중입니다: dplyr
## 
## 다음의 패키지를 부착합니다: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# 차량별 일평균 가동시간 가져오기  
  df2<-df1 %>% 
          left_join(mv, by ="차량번호")


그리고, 일별 가동일수를 left_join() 함수를 써서 가져옵니다.

# 월별 가동일수 가져오기 
  df3<-df2 %>% 
        left_join(cal, by="월") 


챠량/월별 가동시간을 dplyr 패키지의 mutate() 함수를 이용하여, 연산 하여봅시다. mutate() 함수는 기본적으로, 필드를 추가로 연산 할때 많이 사용됩니다.

# 월 가동시간 만들기  
  opp_df <-df3 %>%
            mutate(월_가동시간 = 일평균_가동시간 * 일수)


아래와 같이 차량/월별로 계획을 할수 있습니다.

head(opp_df)
##   차량번호 월 일평균_가동시간 일수 월_가동시간
## 1   MV0001 01               9   31         279
## 2   MV0001 02               9   28         252
## 3   MV0001 03               9   30         270
## 4   MV0001 04               9   30         270
## 5   MV0001 05               9   31         279
## 6   MV0001 06               9   30         270



3.3.2 요인수준 생성

요인 수준 벡터를 인코딩 하는 경우 함수 gl(generate levels)을 사용 한다. 3개 인자는 최대값, 반복 수 전체 길이 입니다. 다음은 요인 수준을 4까지 하고 반복수는 3회 총길이 12가 되도록 하는 예제 입니다.

gl(4,3)
##  [1] 1 1 1 2 2 2 3 3 3 4 4 4
## Levels: 1 2 3 4


다음 함수는 전체 패턴을 2번 반복 하는 함수 입니다.

gl(4,3,24)
##  [1] 1 1 1 2 2 2 3 3 3 4 4 4 1 1 1 2 2 2 3 3 3 4 4 4
## Levels: 1 2 3 4


요인 수준이 문자인 경우에는 lables를 사용 합니다.

  Temp<-gl(2, 2, 24, labels = c("Low", "High"))
  Soft<-gl(3, 8, 24, labels= c("Hard", "Medium", "soft"))
  M.user<- gl(2,4, 24, labels = c("N", "Y"))
  Brand<-gl(2,1, 24, labels = c("X","M"))
  data.frame(Temp, Soft, M.user, Brand)
##    Temp   Soft M.user Brand
## 1   Low   Hard      N     X
## 2   Low   Hard      N     M
## 3  High   Hard      N     X
## 4  High   Hard      N     M
## 5   Low   Hard      Y     X
## 6   Low   Hard      Y     M
## 7  High   Hard      Y     X
## 8  High   Hard      Y     M
## 9   Low Medium      N     X
## 10  Low Medium      N     M
## 11 High Medium      N     X
## 12 High Medium      N     M
## 13  Low Medium      Y     X
## 14  Low Medium      Y     M
## 15 High Medium      Y     X
## 16 High Medium      Y     M
## 17  Low   soft      N     X
## 18  Low   soft      N     M
## 19 High   soft      N     X
## 20 High   soft      N     M
## 21  Low   soft      Y     X
## 22  Low   soft      Y     M
## 23 High   soft      Y     X
## 24 High   soft      Y     M

댓글 없음:

댓글 쓰기

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

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