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

+ Recent posts