R  데이터 조작 II

 

  1. 데이터 처리에 중요한 패키지

    1. 전처리 -> sqldf, plyr, reshape2, data.table, foreach

    2. 병렬처리 패키지 -> doMC

    3. 코드 테스트 -> testthat, browser(), system.time(), Rprof()

    4.  모두 필요하다

  2. sqldf 패키지: SQL 명령이 주어지면 자동으로 스키마 생성, 테이블로 데이터 로딩, SQL문을 수행, 이후 다시 R로 로딩

    1. sqldf(‘SQL명령문’)

      1. ex) sqldf(‘select distinct Species from iris’)

      2. iris내에 Sepal.Length의 평균을 구해보자

        1. sqldf(“select avg(Sepal_Length) from iris where Species=’setosa’”)

        2. SQL은 컬럼명에’.’이 들어갈 수 없어서 Sepal_Length로 적어야하고, 대소문자 구분이 없다.

      3. iris내의 Species별 평균을 구해보자

        1. sqldf(‘select Species, avg(Sepal_Length) from iris group by Species’)

  3. plyr 패키지: 데이터를 분활(split),특정함수에 적용(apply), 그 결과를 조합(combine)하는 세단계를 처리하는 함수를 제공

    1. 입력값: 배열, 데이터프레임, 리스트

    2. 함수의 첫번째와 두번째자리의 의미: a: array, d: data.frame, l: list 중 (1) 입력값, (2) 출력값

    3. 함수

      1. adply(): 입력값이 꼭 a일 필요가 없다. 숫자 색인으로 각 행이나 열을 읽을 수 있으면 됨

        1. 왜쓰나? apply()를 사용하면 output은 ‘행렬’로 결과를 변환해서 문자가 섞여있으면 모두 문자로 변환됨

      2. ddply()

        1. Species로 그룹지을 때, .(변수) <- 이렇게 사용

          1. ex) ddply(iris, .(Species), function(sub){data.frame(Sepal.Length.mean)=mean(Sepal.Length))})

        2. 여러변수들로  그룹지을 때 -> .(변수, 변수)

          1. ex) ddply(iris, .(Species, Sepal.Length > 5.0), function(sub){data.frame(Sepal.Length.mean=mean(Sepal.Length))})

      3. m*ply()

        1. 데이터프레임 혹은 함수만 인자로 받아서 output을 바꾸는 함수

        2. 난수 생성해서 프레임에 추가하는 예제

          1. ex) mdply(x, rnorm, n=2)

  4. transform(), summaries(), subset(): plyr()패키지들과 함께 사용되는 함수들

    1. transform(): 데이터프레임 내의 데이터를 수정하여 새로운 항목으로 추가할 때

      1. ex) ddply(baseball, .(id), transform, cyear=min(year))

      2. 만일 두개 이상의 항목을 추가하고 싶다면 -> mutate()사용

        1. ex) ddply(baseball, .(id), mutate, cyear, cyear1)

    2. summarise(): 데이터를 조작하고 추가하고 싶은 컬럼을 새로운 데이터프레임에 넣어서 반환

      1. ex) ddply(baseball, .(id), summarise, cyear= min(year))

    3. subser(): 조건에 맞는 데이터를 추출

      1. ex) ddply(baseball, .(id), g == max(g))

  5. reshape2()

    1. melt(): 데이터 변형

    2. melt(인자, dataframe name)

      1. ex) melt(id=1:4, french_fries)

        1. id는 식별해주는 id, french_fries는 data.frame자료

      2. NA값이 포함된 것을 지우고 싶을 때

        1. rm.na =T

    3. complete.cases(data.frame): 하나라도 NA가 있으면 FALSE, 하나도 없으면 TRUE를 반환

  6. cast(): dcast/ acast -> d: data.frame/ a: vector, matrix, array

    1. dcast(데이터명, formula)

      1. ex) m <- melt(id=1:2, smiths)

      2. ex) x <- dcast(m, subject + time ~ … )

      3. identical(x, smiths) : 확인작업

    2. id를 모두 안 써도 됨

      1. ex) id = time만 써도 됨

  7. data.table(): data.frame와 비슷한 구조

    1. 패키지이기 때문에 다운과 library필수

    2. 모든 내용을 print하지 않아 편리

      1. 하지만 내용을 충분히 보고 싶을때는 x[1:n,]을 사용해서 지정

    3. 데이터 프레임과 호환이 잘 되어 프레임이사용하는 함수는 웬만하면 사용 가능, 하지만 안될 시 as.data.frame()으로 변환해서 사용

    4. data.table[행,표현식,옵션]으로 인덱싱

      1. 사용법 예시: as.data.table(iris), iris[1, Species]

        1. 주의할 점: 따옴표 사용 안함, data.frame은 사용함

      2. 옵션은 by를 사용

        1. ex) iris_table[,Sepal.Length,by=Species]

    5. setkey()

      1. 만일 어떤 조건을 줘서 그에 맞는 조건에 해당하는 행을 모두 출력할 때는 R은 모든 행을 훑고지나가면서 탐색한다. 이는 시간이 많이 걸리는 행위이기 때문에 미리 조건에 맞는 색인을 만들어 놓고 한다면 훨씬 수월 -> 이를 위해, key를 지정

      2. 사용법

        1. setkey(데이터명, key로 설정할 column)

        2. ex) setkey(dt1, x)

        3. dt1[dt2,]: dt1에서 x를 key로 설정했기 때문에 이에 대응되는 dt2의 컬럼을 dt1에 추가해서 보여줌

          1.  
        4. datatable1[x=13,list(x_mean=mean(x),x_std=s\d(x))]: datatable1의 x값이 13인 애들만 search하고 y의 평균 구해라

        5. merge()사용 가능 -> 속도 느림

    6. 참조를 이용한 데이터 수정

      1. 사용법: dt[i,변수명 := 값]

    7. rbindlist

      1. plyr패키지에 ldply()가 llply()보다 느리다.

      2. rbindlist()는 llply()로 계산결과를 리스트로 반환해서 이를 list를 묶어 데이터프레임으로 변환하는 것

  8. doMC: 멀티코어를 사용해서 병렬 컴퓨팅을 하는 것

plyr(), foreach()함수를 사용해서 가능

'R > 기초' 카테고리의 다른 글

R 새로운 종류의 Plot  (0) 2019.08.13
R 데이터 plot 함수  (0) 2019.08.13
R 데이터 조작 I  (0) 2019.08.12
R에서 사용하는 제어문, 함수, 그에따른 연산  (0) 2019.08.12
R에서 사용하는 변수  (0) 2019.08.12

R  데이터 조작 I

 

  1. 데이터 읽고 쓰기, 데이터 자체를 저장, 데이터끼리 묶기

    1. read.csv(파일명, header=TRUE/FALSE)

      1. 읽어올 때 문자들을 모두 factor처리하기 때문에, 이를 문자열로 바꾸기 위해 -> stringAsFactors=FALSE처리하여 들여옴 ex)read.csv(a.csv, stringAsFactors=FALSE)

      2. NA를 읽어들어 올때, 이를 문자처리 하기 위해 NIL로 변환되서 들어옴.  이 때, 그 열의 나머지 숫자들도 문자처리해서 이를 막아줘야 함. -> na.strings이용 ex) x <- read.csv(a.csv, na.strings=c(‘NIL’)) : 이러면 NIL을 인식해 na처리

    2. write.csv(변수, ‘파일이름.csv’,row.names = F)

      1. row.names는 행에 자동으로 이름을 부여하는가인데, default가 T

      2. save,load: 데이터만 저장하고 읽어올 수 있음

        1. save(x,y,file=’xy.RData’)

        2. load(‘xy.RData’)

    3. rbind/cbind: rowbind/columnbind

      1. rbind로 벡터나 데이터 프레임을 결합할 수 있음

      2. data.frame을 생성할 때, stringsAsFactors = FALSE로 하는 이유는 데이터가 명목형이 아닌 단순 문자열이기 때문이다.

      3. 데이터프레임은 cbind로 결합은 가능하나 오른쪽에 같다 붙이는거라서 새로운 행이 추가됨, 목적과 맞지 않음.

        1. $를 사용해서 열 추가

 

  1. apply류 함수

    1. 기본 구조 apply류함수(적용대상, 함수->만드는 것 가능)

      1. ex)apply(x, function(x){x*2})

    2. 행렬의 경우 -> apply함수를 사용

      1. ex)apply(행렬, 1/2=행/열, apply함수명)

      2. iris데이터를 이용 -> apply(iris[,1:4],2,sum): 4개 열들의 합

        1. 대체가능한 함수들

          1. rowSums(),colSums()

          2. ex) colSums(iris[,1:4])

    3. 벡터 또는 리스트의 경우 -> lapply

      1. ex)lapply(1:3,function(x){x*2}) -> output이 list가 아닌 벡터이고 싶을 때 -> unlist(리스트) 사용

      2. list를 사용해서 평균구하기 -> ex) lapply(리스트,mean)

        1. list인 아웃풋을 데이터프레임으로 변환하고 싶을 때 -> 

          1. unlist(): 벡터로 변환

          2. matrix(): 행렬로 변환

          3. as.data.frame(): 행렬을 데이터프레임으로 변환

          4. do.call(): data.frame(do.call(cbind, lapply(iris[,1:4],mean))) -> 이런 방식 가능

    4. 벡터, 리스트, 데이터프레임의 경우, output이 list가 아닌 행렬,벡터로 반환하는 함수 -> sapply

      1. ex) sapply(iris[,1:4],mean) -> 결과가 벡터 -> as.data.frame을 이용해서 데이터프레임으로 구조 변환 가능

        1. 이 때, 행과 열이 뒤바뀌어서 나오는데, t(행렬)을 수행해서 원래 모양으로 변형

      2. 한가지 타입만 저장 가능한 벡터, 행렬, 배열로 반환하기 때문에 입력값들이 동일한 구조형이어야한다. -> 여러 데이터 타입에 대해 사용하고 싶다면 lapply()사용

    5. 어떤 범주에 해당f하는 값들만 연산하고 싶을 때 -> tapply()

      1. ex) tapply(iris$Sepal.Length, iris$Species, mean): 종에 따른 꽃받침 길이의 평균

    6. 함수에 인자를 넘겨주어서 연산 -> mapply()

      1. ex) mapply(function, c(1,2,3), c(‘a’,’b’,’c’))를 수행하면 (1,’a’)와 (2,’b’),(3,’c’)로 묶여서 function에 들어가서 연산하여 결과를 도출

      2. ex) mapply(mean, iris[1:4]): 1부터 4열까지 한 열씩 평균을 구함

 

  1. base패키지가 기본이 됨

    1. summary(): generic function in r

      1. 인자가 자료일 땐 -> 통계값, 인자가 모델일 때 ->모델 요약

      2. 수치형 자료의 경우 quantile사용 가능

        1. ex) quantile(iris$Sepal.Length)

    2. order(): index를 output으로 내보냄

      1. 기본 패키지여서 자주사용

    3. sample(): 주어진 데이터에서 샘플 추출

      1. replace =TRUE 중복 허용

      2. sample(1:10,5,replace=T)

      3. 무작위로 데이터 뽑고 싶을 때 사용

        1. iris[sample(nrow(iris)),]: iris데이터를 무작위 index를 부여해 무작위로 뽑음

    4. split(데이터, 분리조건)

      1. ex) split(iris, iris$Species): 종을 기준으로 iris구분

        1. 반환값은 list - > lapply사용

 

  1. doBy 패키지

    1. summaryBy(): 특정 조건을 주어서 summary를 함

      1. ex) summaryBy(Sepal.Length + Sepal.width ~ Species, iris)

        1. +로 묶은건 열을 주는 것, Species는 행, iris는 데이터

    2. orderBy(): 특정 조건으로 ordering

      1. ex) orderBy(~Sepal.Width, iris)

        1. 모든 열을 볼것이기 때문에 공백 후, ~ Sepal.Width를 기준으로 정렬

        2. 이 때, Species에 의해 먼저 정렬 후, 정렬

    3. sampleBy()

      1. ex) sampleBy(~Species, frac=0.1, data=iris)

      2. 10%로씩 끊어서 추출



  1. subset(데이터, 조건, select=열선택)

    1. split()함수와 유사하지만 특정 조건의 것을 분류하는데 사용

      1. ex) subset(iris, Species ==’setosa’ & Sepal.Width > 5.0, select = c(Sepal.Width))

        1. select 조건을 걸면 그 조건에 해당하는 것만 보여줌

        2. 특정열을 제외하려면 select = -c(Sepal.Width)이런 식

  2. merge(): 두개의 공통된 프레임으로 데이터셋을 묶는 것

    1. ex) x<- data.frame(name =c(‘a’,’b’,’c’), math =c(20,30,40))

    2. ex) y<- data.frame(name =c(‘a’,’b’,’c’), english =c(20,30,40))

    3. ex) merge(x,y)

      1. 만약 한쪽 데이터의 갯수가 모자르면 all=TRUE로 설정

        1. 빈 데이터를 NA로 채움

    4. cbind()는 단순히 열을 합치는 것

  3. sort()/order()

    1. sort(): 값을 반환

    2. order(): index반환

  4. with()/within()

    1. with(): 데이터프레임의 열을 데이터프레임 이름 없이 접근하기 위함

      1. ex) with(iris, {print(Sepal.Width)})

    2. within(): 데이터를 수정할 때 사용, with와 비슷

      1. ex) within(x, ifelse(is.na(val),val <- median(val, rm.na =T),x))

      2. median(열, na값을 지움)

  5. attach()/detach(): with()와 within()함수랑 비슷, 아얘 불러놓고 쓰기

    1. ex) attach(iris)

    2. attach()하고 나서 데이터 프레임을 변경하면 detach()하고나서 변한 데이터가 적용되지 않음

  6. which(): 조건에 해당하는 위치 찾음

    1. ex) which(x%%2==0)

    2. ex) x[which(x%%2==0)]

      1. which.min(x), ex) x[which.min(x)]

      2. which.max(x)

  7. aggregate(formula, 데이터, 함수)

    1. ex) aggregate(Sepal.Length ~ Species, iris, mean)

  8. stack()/ unstack(): summaryBy()등을 사용하기 편치않은 데이터 구조를 바꿀 때

    1. x<- data.frame(medicine =c(‘a’,’b’,’c’), ctl = c(1,2,3), exp = c(2,3,4))

    2. stack(x)

    3. unstack(stacked_x, values~ind)

 

'R > 기초' 카테고리의 다른 글

R 새로운 종류의 Plot  (0) 2019.08.13
R 데이터 plot 함수  (0) 2019.08.13
R 데이터 조작 II  (0) 2019.08.13
R에서 사용하는 제어문, 함수, 그에따른 연산  (0) 2019.08.12
R에서 사용하는 변수  (0) 2019.08.12

R 제어문, 연산, 함수

 

  1. 특징

    1. 결측치를 잘 다뤄야한다는 점

    2. 벡터연산을 수행한다는 점

 

  1. 제어문

    1. if문

      1. if (조건=참) {수행문} else {수행문}

    2. for문

      1. for (조건) {수행문}

    3. while문

      1. while (조건=TRUE){수행문}

 

  1. NA 처리

    1. R의 많은 함수는 이 문제를 해결하기 위해 -> NA를 제거하는 함수를 개발

      1. ex) sum(c(1,2,3,NA),na.rm=T)

      2. caret: Classification and Regression Training

    2. na.omit

      1. NA가 있는 행을 누락시킴

    3. na.pass

      1. NA의 포함 여부를 상관하지 않고 지나치고 계산

    4. na.fail

      1. NA가 있으면 실패라는 에러 문장을 보여줌

 

  1. 함수 작성

    1. function_name <- function(입력값1, 입력값2,...) {수행문}

    2. 주의!!! -> 반환값 앞에 return을 붙여줘야함

    3. 함수는 인자의 위치를 사용해서 입력값을 넣던가  or 함수의 인자 이름을 지정해서 입력값을넣는 두가지 방법이 있다.

      1. function(1,2) or function(x=1,y=2)

    4. 함수를 작성할 때 간혹, function1 <- function(z,...)에서 보듯이 ...을 발견

      1. 다른 함수로 인자를 넘겨줄 때 사용

      2. ex) function1 <- function(z,...) { function2(...)}

    5. nested function

      1. 중첩함수: 함수 안에 함수를 정의하여 사용하는 것

 

  1. scope

    1. 코드에서 사용한 변수를 어디에서 사용 가능한지 정하는 것을 scope라고 한다.

    2. console에서 변수를 설정하면 어디에서나 사용 가능한 변수로 설정

    3. 함수 안에 변수가 설정되면 함수 내에서만 적용, 우선권 -> 함수

    4. 함수내부의 변수는 밖에 정의되어 있으면 사용가능하나 밖에서는 함수 안의 변수를 찾지 못한다.

      1. 중첩함수도 이와같은 규칙이 적용된다.

      2. 만약 중첩함수 내부의 함수의 변수뿐만 아니라 외부의 변수도 변형시키고 싶다면 <<-를 사용

    5. nested function에서도 내부함수에서 변수가 없다면 외부함수에서 찾는다. 하지만 그것도 없다면 전역변수를 찾는다.

 

  1. 벡터연산

    1. 벡터연산을 기본으로 한다.

    2. x <- c(1,2,3,4,5)

      1. ex) x+x, x==x, etc.

      2. ifelse와같은 함수도 가능 -> ifelse(x%%2==0,’even’,’odd’)

      3. ifelse(조건, 참일 때 수행, 거짓일 때 수행)

    3. data.frame을 다룰때 벡터로 행을 선택가능

      1. x <- data.frame(a =1:3, b=3:6)

      2. ex) x[x$a%%2==0,] -> a행을 2로 나눴을 때 0인 경우와 모든 열 indexing 

 

  1. 객체

    1. R은 모든 데이터들이 객체이다. 

      1. 객체는 불변 -> 데이터 수정이 불가

    2. 예를들면, 데이터프레임의 구조를 바꾸는 함수에 데이터프레임을 넣어도 하나의 객체로 인식된 데이터프레임이 바뀌지 않고 함수 안에서 복사본을 사용한다. 만약 복사본이 아닌 직접 객체를 사용하고 싶을 때는 return을 사용해야한다.

      1. 문제점: 매번 복사하면 많은 메모리 사용

      2. 해결:  copy on write기법을 사용: 복사해야할 순간이 오면 복사함

 

 

 

'R > 기초' 카테고리의 다른 글

R 새로운 종류의 Plot  (0) 2019.08.13
R 데이터 plot 함수  (0) 2019.08.13
R 데이터 조작 II  (0) 2019.08.13
R 데이터 조작 I  (0) 2019.08.12
R에서 사용하는 변수  (0) 2019.08.12

-----------------------------------------------------------------------

내 첫 블로그 게시글! 

천문학과를 졸업하여 현재는 의료데이터를 만지면서 놀고있지만

나에게도 남들에게도 조금은 도움이 되는 일을 해보고자

데이터사이언스 관련글을 블로그로 남기기로 했다!

사실 나도 잘 모른다! 하면서 배우는거일 것이니,,

----------------------------------------------------------------------- 

#출처: r을 이용한 데이터분석 실무, 지은이: 서민구

 

 

R 변수



  1. 변수를 다룰 때 큰 틀의 특징

    1. 1부터 counting

    2. 언제나 위에서 아래로 row가 기준

      1. 행렬 내의 순서를 제외 (위에서 아래로 -> 열 기준)

    3. 각함수의 사용법은 ‘?함수’를 통해 search

    4. 데이터 프레임 형식의 dimension이 1이 되면 자동으로 벡터형으로 변환, 떨굼

      1. 이를 방지하려면 drop= FALSE로 지정

 

  1. 변수

    1. 되도록 ‘=’보다 ‘<-’를 권장, 에러가 나기 때문에

    2. 주로 벡터형이 기본

  2. 기본 함수

    1. dim(): dimension

    2. str(): data type

    3. class(): class type

    4. head(): 6 lines of the date from the first line

    5. rm(list=ls()): 저장된 변수 제거

 

  1. factor

    1. 범주형 변수를 위한 데이터타입

      1. ordered=TRUE  -> 순서가 있는 범주형으로 인식

      2. ex) sex <- factor(c(‘a’,’b’),ordered = TRUE)

 

  1. vector

    1. r에서 데이터의 기본형, 중첩이 불가능 -> 이 때, list를 사용

    2. seq(start,end,by)

      1. vector의 이름 붙여주는 함수: names(vector)

      2. seq_len(N): 1~N까지 숫자형 벡터 반환

      3. seq_along(vector): vector길이만큼의 1~길이까지의 숫자형 벡터 반환

    3. rep(start:end,repeat number)

      1. ex) rep(1:3,2) -> c(1,2,3,1,2,3)

    4. rep(start:end,each=N)

      1. 각각 N회 반복됨

      2. ex) rep(1:2, each=3) -> c(1,1,1,2,2,2)

    5. indexing: 벡터의 요소에 접근하기

      1. 숫자접근/벡터/이름 접근 가능

        1. ex) x[1]= 1

        2. x[-1]: 첫번째 요소를 제외하고 반환

        3. python과 다름 ‘-’기호는 제외를 의미

        4. ex) x[1:3]

        5. ex) x[c(1,2,3)]

        6. ex) x[Sepal.Length]

    6. vector 길이

      1. length(), NROW(): 벡터의 길이

      2. nrow(): 행렬에서만만 가능 (길이)

    7. vector 연산

      1. %in%: 벡터안에 그 값이 있나 확인

      2. 차집합: setdiff(c(1,2,3),c(1,3)) -> c(2)

      3. 합집합: union(c(1,2,3),c(4)) -> c(1,2,3,4)

      4. 교집합: intersect(c(1,2,3),c(2,3)) -> c(2,3)

      5. 집합간 비교: setequal(c(1,2,3),c(1,2,3,4)) -> TRUE

 

  1. list: N차원 벡터

    1. 다른 언어에서 흔히보는 dictionary에 해당, (키,값)을 담는 associated array(연관배열)이다.

    2. ex) x <- list(name=’foo’,height=c(50,30,50))

    3. x[[1]] -> ‘foo’

    4. x[1] -> name

 

  1. matrix

    1. 모든 요소가 숫자일때만 사용가능함

    2. ex) matrix(1:9,nrow=3)

      1. 첫번째 자리는 vector형식이면 다 들어가도된다.

      2. 이럴 때, column기준으로 숫자가 채워지는데 row를 기준으로 하고 싶다면 byrow=TRUE로 켜주면 된다. 

      3. ex) matrix(1:9,nrow=3,byrow=TRUE)

    3. matrix의 행과 열에 이름 부여

      1. matrix(1:9,nrow=3,dimnames=list(c(‘row1’,’row2’,’row3’),c(‘col1’,’col2’,’col3’))

    4. indexing

      1. 숫자와 행렬로 indexing할때는 row나 column 둘 중 하나만 사용해도 되고 둘 다 사용해도 됨, 하지만 name으로 indexing하는 경우 둘 다 채워줘야 함

    5. 연산

      1. 곱셈 *, 나눗셈 /, 덧셈 +, 뺄셈 -

      2. 행렬끼리의 곱셈 %*%

      3. 역행렬 solve(matrix)

      4. 대각행렬:t() 

      5. 행렬차원: ncol(), nrow()

 

  1. array(배열)

    1. N차원 행렬

      1. ex) array(1:12,dim=c(2,2,3))

    2. 차원을 알고 싶을 때: dim(vector,matrix,array)

 

  1. data frame 

    1. 가장 중요한 자료형, 행렬과 마찬지의 모습이지만 관측치와 범주등을 표현하기에 특화되어 있음

    2. a <- data.frame(x=c(1,2,3,4),y=c(2,3,4,5)) 기본 표현법

    3. data.frame에 열을 추가 하고 싶을 때 -> a$z = 1:4

    4. 데이터 차원이 1차원으로 변경되어 자동으로 벡터 변환이 되는 것이 싫을 때

      1. drop= FALSE 사용

      2. ex) a[1,,drop=FALSE]

    5. 데이터 형을 보고 싶을 때 -> str(data frame name)

    6. 일부분만 살펴보기 위해 -> head(data frame name)

    7. 칼럼명이 있는지 찾아보기

      1. 칼럼명 b,c가있는지 찾아보기: a[,names(a) %in% c(‘b’,’c’)

 

  1. 데이터 타입 판별 및 변환

    1. 판별 -> class(),is.numeric(), is.matrix()

    2. 변환 -> matrix, list를 data.frame으로 변환할때는, data.frame안에 넣으면 됨

      1. ex) data.frame(matrix(c(1,2,3),ncol=3))

변환 as함수 -> as.numeric, as.factor, as.data.frame, as.matrix

'R > 기초' 카테고리의 다른 글

R 새로운 종류의 Plot  (0) 2019.08.13
R 데이터 plot 함수  (0) 2019.08.13
R 데이터 조작 II  (0) 2019.08.13
R 데이터 조작 I  (0) 2019.08.12
R에서 사용하는 제어문, 함수, 그에따른 연산  (0) 2019.08.12

+ Recent posts