티스토리 뷰
데이터 가공을 위한 주요 함수 정리
#. 데이터 색인
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, 조건 치환
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 |