티스토리 뷰

반응형

데이터 가공을 위한 주요 함수 정리


 

#. 데이터 색인

1. 벡터  c(요소1, 요소2, ...)

  - 정수 색인       : vec[5]

  - 이름 색인       : vec['b']

  - 벡터 색인       : vec[c(1,3,5)]

  - 슬라이스 색인 : vec[1:5]

  - 조건 색인       : vec[vec$'PAY'>500]

 

2. 리스트   list (key1 = value1, key2 = value2, .. )

  - 정수(키) 색인 :  list[[1]][1]

  - 이름 색인      : list$name[1]  or  list[['name']][1]  

 

3. 행렬   matrix(1:20, nrow=4, byrow = F(세로 채우기), T(가로 채우기))

  - 정수 색인       : m[2,3]       # 2행,3열

  - 이름 색인       : m[2,c('b','e')]

  - 벡터 색인       : m[c(2,3),c(3,5)]

  - 슬라이스 색인 : m[1:3,]

  - 조건 색인       : m[m[ ,'e'] == 20, 3:5]       # m1의 e값이 20인 행의 3~5번째 컬럼 출력

 

4. 배열  Array(데이터, dim = 차원, 차원의 이름)

  - 정수 색인       : a[2,2,1]  or  a[,,1][2,2]       # 1층, 2행, 2열

  - 벡터 색인       : a[c(1,2),c(4,5),1]      # 1층, 1,2행, 4,5열

  - 슬라이스 색인 : a[1:2,4:5,1]      # 1층, 1~2행, 4~5열

 

5. 데이터 프레임   data.frame(data, stringsAsFactors = T)

  - 정수 색인       : d[2,3]      

  - 이름 색인       : d[,'name']

  - 벡터 색인       : d[c(1,4),]

  - 슬라이스 색인 : d[1:4,] 

  - 조건 색인       : d[d[,3]>100,]

 참고글: 변수 (이동) 


 

 

#. 특정 조건에 만족하는 데이터의 치환

1. 조건 색인을 활용한 치환

emp2[emp2$PAY=='-','PAY'] <- 0        # PAY 컬럼에 '-' 라는 문자가 있으면 0으로 치환

 

2. ifelse를 활용한 치환

ifelse(emp2$PAY == '-', 0, as.numeric(emp2$PAY))

 

3. if와 for문을 활용한 치환

f <- function(x, c) {
  v1 <- c()
  for(i in 1:length(x)){
    if(x[i]==c) {
      v1 <- c(v1, 0)
    } else {
      v1 <- c(v1, as.numeric(x[i]))
    }
  }
  return(v1)
}
f(emp2$PAY,'-')

 

 

 

 

#. 패턴, NA, 조건 치환

1. 패턴 치환

 str_replace_all(prof$ID, '[[:punct:]]', '')     # 특수문자가 포함된 ID의 특수문자 제거


2. NA 치환

 prof[is.na(prof$BONUS),'BONUS'] <- 0   # BONUS 컬럼의 NA 값을 0으로 치환


 3. 조건 치환

 prof[str_detect(prof$ID, '[[:punct:]]'),'ID'] <- 'X'    # 특수문자가 있는 ID를 X로 치환

참고글 : 정규표현식 (이동) 


 

 

#. 문자열 가공 함수

1. 문자 검사   stringr :: str_detect(대상, 패턴)

prof[str_detect(prof$ID,'cap'),]      # ID 컬럼에 'cap' 이라는 패턴이 들어가는 행 추출

 

2. 문자 치환   stringr :: str_replace_all(대상, 문자, 치환할 문자)

str_replace_all(prof$ID,'cap','car')     # ID 컬럼에 'cap' 이라는 문자를 'car'로 치환

 

3. 문자열 분리  stringr :: str_split(대상, 분리 기준 문자)  or  strsplit(대상, 분리 기준 문자) 

str_split(prof$EMAIL, '@')      # EMAIL 컬럼 문자열들을 '@' 기준으로 분리 (리스트로 리턴)
strsplit(prof$EMAIL, '@')

 

4. 문자열 결합   stringr :: str_c(data, sep, collapse) or paste(data, sep, collapse)

str_c('a','b','c') = str_c(v1, collapse = '')    # 주의. 벡터 내 문자 연결 시 collapse 사용

str_c('a','b','c', sep = ',') = str_c(v1, collapse = ',')     # 분리된 인자들을 ,로 연결

paste('a','b','c', sep = '') paste(v1, collapse = '')

> str_c(c(1,2,3), c('a','b','c'), sep = '-')

[1] "1-a" "2-b" "3-c"

> str_c(c(1,2,3), c('a','b','c'), collapse = '-')

[1] "1a-2b-3c"

> paste(c(1,2,3), c('a','b','c'), sep = '-')

[1] "1-a" "2-b" "3-c"

> paste(c(1,2,3), c('a','b','c'), collapse = '-')

[1] "1 a-2 b-3 c"


5. 문자열 추출  substr(문자열, 시작위치, 끝나는 위치 ) 

substr('xx2018',3,6)   # 2018만 추출

 참고글: 문자열함수 stringr (이동) 


 


#. 형 변환 함수

1. 날짜를 문자로   as.character(날짜, '날짜형식')

as.character(date)    # %Y:년 / %m:월 / %d:일 / %A: 요일


2. 문자를 날짜로    as.Date(문자, '날짜형식')

as.Date('2018/12/01', '%Y/%m/%d') 


3. 숫자 타입으로

as.numeric()


4. Data frame으로

as.data.frame() 


5. 행렬로

as.matrix()


6. 배열로

as.array()


7. 팩터로

as.factor() 


8. 행/열 전환
t()

참고글 : 데이터 타입 변환 함수 (이동) 

           날짜와 시간 (이동) 





#. 데이터 프레임(Data frame) 구조 변경

1. 행(row) 이름 변경

  rownames(df1) <- c('a','b','c','d','e') 

  rownames(df1) <- df1$no    # 특정 컬럼을 행 이름으로 지정 


2. 행(row) 추가   rbind(원본 데이터, 벡터)

  df1 <- rbind(df1,c(5,'mango',100,10))     # rbind 함수를 사용한 방법

  df1[nrow(df1)+1,] <- c(5,'mango',100,10)     # 색인을 사용한 방법


3. 행(row)번호 만들기

  rownames(df1) <- 1:nrow(df1)


4. 컬럼(column)이름 변경   

  colnames(df1) <- c('no','name','price','qty') 

  colnames(df1) <- df1[1,]     # 특정 행을 컬럼 이름으로 지정


5. 컬럼(column) 추가  cbind(원본 데이터, 벡터)

  df1 <- cbind(df1,c('a','b','c','a','b'))     # cbind 함수를 사용한 방법

  df1$area <- c('a','b','c','a','b')     # 색인을 사용한 방법


6. 컬럼이 Factor형으로 저장되어, 행(row) 추가가 힘들 경우 조치 방법

   - data frame 생성 시 문자열 컬럼을 factor형으로 생성하지 않기

     data.frame(no = no, name = name, price = price, qty = qty, stringsAsFactors = F)

  - 이미 생성된 data frame의 factor형 컬럼을 일반 문자열 컬럼으로 변경 

     df1$name <- as.character(df1$name)

  - 이미 생성된 data frame의 문자열 컬럼을 factor형으로 변경
     df1$name <- as.factor(df1$name) 

참고글 : 데이터 프레임(Data frame) (이동) 




#. 사용자 정의 함수

NA값을 이전 행 값으로 치환하는 사용자 정의 함수

> f_fillna <- function(x) {

    v1 <- c()                # 빈 벡터 생성(스칼라 형태의 반환값들을 묶어주기 위해)

    for(i in 1:length(x)) {

      if(is.na(x[i])) {

        v1 <- c(v1,x[i-1])   함수의 결과는 하나의 값(스칼라)이므로 벡터에 저장하여 묶어서 리턴에 주어야 합니다.

      } else {

        v1 <- c(v1,x[i])

      }

    }

    return(v1)   # vector를 함수 밖에서도 쓸 수있도록 리턴

  }

> apply(dis[,-1], 2, f_fillna)


    . 함수에 여러개의 인자 전달이 필요한 경우(mapply 사용)

# 1) mapply(function, ...) => mapply함수는 function에 여러개의 인자 전달가능                           

> v1 <- c('a','b','c')                                  (함수에 많은 인자가 필요한 경우 사용)

> v2 <- c(1,2,3)

> library(stringr)

> map_f <- function(x, y) { 

+   str_c(x,y, sep = '_')

+ }

> mapply(map_f, v1, v2)      # 뒤의 인자들을 묶어서 차례로 function에 전달

    a     b     c 

"a_1" "b_2" "c_3"


    . 함수에 여러개의 인자 전달이 필요한 경우(apply 사용)

# 2) apply(array, margin, ...) => apply함수는 function에 다수의 인자 전달 불가(함수 옵션만 가능) 

> data1 <- c('ab/c', 'bcd/e','abcd/r')

> d1 <- data.frame(data1,start=c(1,1,1), end=c(2,3,4))  # apply함수는 데이터 프레임(2차원 구조)형태만 적용 가능

> d1

   data1 start end

1   ab/c     1   2

2  bcd/e     1   3

3 abcd/r     1   4

> f_substr2 <- function(data) {                 # 2차원 데이터의 벡터 요소를 참조해서 사용

+   substr(data[1], data[2], as.numeric(data[2]) + as.numeric(data[3]) - 1) 

+ }

> apply(d1, 1, f_substr2)

[1] "ab"   "bcd"  "abcd"


# apply()는 다수의 인자 전달이 가능하지만 복잡하므로, 행/열 별로 묶어서 전달하기 위해 사용

  벡터로 묶어서 전달하는 것에 포인트(인자는 무조건 하나!) 


# Q. substr 함수 생성 (첫 번째서부터 3개의 문자 추출)

> data1 <- c('ab/c', 'bcd/e','abcd/r')

> f_substr <- function(data, start, n) {

     substr(data, start, start+n-1)

   }

> f_substr(data1,1,3)     # f_substr 자체가 벡터연산이 되기 때문에 연산 가능

[1] "ab/" "bcd" "abc"

> mapply(f_substr, data1, 1, 3)     # function이 벡터연산이 되지 않을 경우 mapply 함수를 통해 적용해야 함

  ab/c  bcd/e abcd/r 

 "ab/"  "bcd"  "abc" 

    # mapply(f_substr, data1, c(1,1,1), c(3,3,3))  => 정확한 표현은 벡터의 개수에 맞게 인자를 벡터로 전달

> mapply(f_substr, data1, c(1,1,1), c(2,3,4))    # 이 경우, 동일한 처리에서 인자를 다르게 정의할 수 있음

  ab/c  bcd/e abcd/r 

  "ab"  "bcd" "abcd"

참고글 : 사용자 정의 함수 (이동) 




#. 기타 데이터 조작 함수

   월별 콜레라 장티푸스 이질 대장균 A형간염

1   1월      6      175  550      7     351

2   2월      5      165  253      9     535

3   3월      1      200   NA     13    1003

...


 1. which.max(), which.min() : 백터의 최대값과 최소값을 갖는 위치 값 리턴, reindex 필요

   dis[which.max(dis$대장균), 1]  # 대장균이 가장 많이 발병한 달 출력


 2. order, doBy::orderBy, sort : 데이터 정렬 (이동)

    dis[order(dis$A형간염, decreasing = T),]   # 데이터를 A형간염이 많은 순으로 정렬


 3. rank : 벡터 값들의 순위 출력 (이동)

   rank(dis$콜레라, ties.method = 'min')    # 콜레라 기준으로 순위 출력


 4. rowSums, rowMeans, colSums, colMeans : 행/열별 합, 평균 

   colSums(dis[,2:6], na.rm = T)   # 각 질병 별 발병횟수의 총 합을 출력 = apply(dis[,2:6], 2, sum, na.rm = T)

    콜레라 장티푸스     이질   대장균  A형간염 

         57     1973     4062      606     6718 


 5. zoo::na.locf : 컬럼별 NA를 이전 행의 값으로 치환 (이동)

   library(zoo)   

   na.locf(dis)   # na 값을 이전 행 값으로 치환


 6. na.omit, tidyr::drop_na : na 값을 포함하는 행 삭제(데이터 프레임 적용 가능)

   na.omit(dis)  or  drop_na(dis)   


반응형

'R' 카테고리의 다른 글

[R 정리] 시각화  (0) 2019.01.29
[R 정리] 데이터 그룹 연산을 위한 주요 함수 정리  (4) 2019.01.20
댓글
최근에 올라온 글
최근에 달린 댓글
링크
Total
Today
Yesterday