본문 바로가기
반영훈

[R]데이터 전처리에 사용했던 함수 정리 20191016

by Banda 2019. 10. 16.

#다양한 패키지
install.packages("dplyr")
install.packages("data.table")
install.packages("bit64")
install.packages("readxl")

#디렉토리 확인 및 변경

1.getwd()
get working directory  = 현재작업중인 디렉토리를 불러오는함수

2.setwd()
set working directory = 작업중인 디렉토리를 ( ) 안의 위치로 변경.
사용예시)setwd("C:/R/banda")


#외부 데이터 불러오기

1.txt(메모장)
data <- read.table(file = "디렉토리/파일이름.txt" header = TRUE, sep = " ")
표형태로 텍스트 파일을 읽어옴
sep(구분자)=[띄워쓰기 1칸 =" ", 콤마 ="," 탭(들여쓰기)= "\t"] 파일 형식에 따라 적으면 됨.

2.csv(Comma Separated Value)
보통 엑셀파일의 저장양식.
data <- read.csv(file = "디렉토리/파일이름.csv", header = TRUE, sep)

3.xls, xlsx
엑셀저장양식이며 2007버전 기준으로 이전은 xls, 후는 xlsx로 저장됨.
상기의 양식을 읽어들이기 위해서 "readxl"이라는 패키지 설치가 필요함.
data <- readxl ("디렉토리/파일이름.xls,xlsx, sheet = 2" *option sheet = %)로 해당시트를 불러옴

4.data.table 패키지
대용량 데이터를 다루는 것에 특화된 패키지  
fread("디렉토리/파일이름.포맷") 함수로 데이터를 빠르게 불러 올 수 있다.
csv파일을 data.table로 불러 오기 위해서는 "readxl"패키지를 이용 하여서 read.csv로 불러온 후
이를 다시 as.data.table(df)로 data.table 형태로 바꿀 수 있다.
ps. 한글로 된 자료를 불러올 때는 fread("pkm2.txt",encoding = "UTF-8") encoding 타입을 이와 같이 추가로 설정해주면 된다.


5.read.lines()
문자 형식의 벡터로 파일을 읽어옴
ex) "햄버거\t피자\t치킨" "콜라\t사이다\t " "맥주\t \t "



##데이터수정
#인덱싱 [filter,select]
1.Vector [a]
> v <- c( 1:10)
> v[3]
[1] 3
> v[1:3]
[1] 1 2 3 

2.Matrix [a,b] #[행,열]
m <- matrix(1:4, nrow=2)
> m
[,1] [,2]
[1,]  1    2
[2,]  3    4

3.Data Frame [a,b], [[a]] #[[a]] a번째 열을 벡터로 출력 = list indexing
df[c(a,b),c] #df 에서 a번째&b번째 row, c번째열(컬럼)을 인덱싱, 혹은 df["컬럼명"]으로 컬럼 추출 가능함. 하지만 용량이 클땐 추출이 되지 않을 수 있으니 [1,2]와 같은 숫자형태로 추출 하고 옆에 주석으로 무엇을 추출했는지 달아두는 것을 추천.

4.subset()
dplyr패키지에 내장된 함수로 조건에 만족하는 벡터, 행렬, 데이터 프레임의 일부를 반환
subset(df, 컬럼명 = "레코드") df에서 컬럼명이 레코드 인 행만 추출
결과 중 특정 열만 가져오기
subset(df,(조건),(select=컬럼명),sort(정렬유무)=F|T)
두 개 이상의 열 선택 시 c로묶거나 ":"을 사용하여야 함 ex)select=c(col1,col2)/select=col1:col2
*subset(df, cut != col) , subset(df, select= -col)로 조건을 만족하는 값을 제외 할 수 있음.

5.which()
특정 값의 위치를 찾을 수 있는 함수
x <- c(3:9)
> x
[1] 3 4 5 6 7 8 9
which( x == 3) #x에서 3의 값을 가진 위치를 반환
[1] 1
x[which( x == 3)] #x에서 3값을 반환
DF
which(df$col > 10) #df에서 col컬럼값이 10이상인 행의 위치를 반환 (몇행)
df[which(df$col > 10),] #df에서 col값이 10이상인 행들을 반환
which.min(), which.max() #최소값과 최대값의 위치를 반환 df[which.min/max(df)]하면 행반환

6.filter(df, 조건)
ex) filter(df, col > 3) #df에서 col 값이 3초과 인 값을 모두 indexing

7.grep|
grep|(조건,col)
ex) filter(grep|('^2', col)
실사용예) sick_sym2002[grep("^[a-zA-Z]{1}[0-9]{2}$", sick_sym2002$SICK_SYM)]
sick_sym2002라는 데이터테이블에서 영문1자로 시작되고, 숫자2로 끝나는 것을 SICK_SYM컬럼에서 모두 가져와라


8.데이터 테이블에서 행 또는 열 추출 df[행,열]
df[,1](해당열=1번열의 값만 불러와라=colname미포함)
df[,-1] (해당열=1을 제외한 모든열을 불러와라colname포함)
df[1,](해당행=1 을 불러와라colname포함) = df$1 (해당열=1을 불러와라=colname포함)
df[-1,](해당행=1 을 제외한 모든 행을 불러와라 colname포함)


9.setdiff(x,y) #x에만 있고 y에는 없는데이터를 추출. 즉, x-y를 추출#


#정렬 [sort, order, arrange]
1.sort() : 디폴트 = 오름차순, 내림차순으로 하기 위해서 "decreasing = TRUE"옵션이 필요, vector에 사용

2.order() : 벡터에는 sort()와 똑같이 적용, df에 주로 사용.

3.split(df, df$컬럼명)
df에서 컬럼명의 변수별로 분리하여 결과를 리스트에 저장.

#열추가
1.mutate(df, 추가할col = 조건)
dplyr 패키지의 함수
ex) mutate(df, date = paste0(ifelse(Month<10, paste0(0,Month), Month),
 ifelse(Day<10, paste0(0,Day),Day)))
t2040 %>% mutate(SICK_01 = ifelse(SICK_SYM==treat_code, 1, 0)) 
#t2040에서 SICK_01컬럼을 추가하는데 조건은 ifelse이하에 만족하는것
#ifelse조건: SICK_SYM열에서 == treat_code를 만족하면 1을, 아니면 0을 출력

2.df$name <- c("a", "b", "c")

df["열이름"] <- 데이터


#제거
ex)subset(df, select=-col) #df의 col열 제거하기
ex)x[-c(which(x%%2==0))] #x행의 x를 2로 나누었을때 나머지가 0을 만족하는 vector를 제거한다.

#결합
1. bind
1.1 rbind(df1,df2): 행간결합(상하)
1.2 cbind(df1,df2): 열간결합(좌우)

2. join
2.1 left_join()
2.2 right_join()
2.3 inner_join()
2.4 full_join()
2.5 anti_join()
2.6 full_join()
자세한 설명은https://statkclee.github.io/data-science/ds-dplyr-join.html 참조


3.merge
3-1) merge() : Inner Join 

 

> # (3-1) merge() : Inner Join
> cust_mart_127_innerjoin <- merge(x = cust_mart_12, 
+                                  y = cust_mart_7, 
+                                  by = 'cust_id')

> cust_mart_127_innerjoin
  cust_id last_name buy_cnt
1     c03      Choi       3
2     c04      Park       1
3     c05       Bae       0
4     c06       Kim       7
5     c07       Lim       3

 

 

(3-2) merge() - Outer Join

 

> # (3-2) merge() : Outer Join
> cust_mart_127_outerjoin <- merge(x = cust_mart_12, 
+                                  y = cust_mart_7, 
+                                  by = 'cust_id', 
+                                  all = TRUE)

> cust_mart_127_outerjoin
  cust_id last_name buy_cnt
1     c01       Kim      NA
2     c02       Lee      NA
3     c03      Choi       3
4     c04      Park       1
5     c05       Bae       0
6     c06       Kim       7
7     c07       Lim       3
8     c08             4
9     c09             1 

 

 

(3-3) merge() : Left Outer Join

 

> # (3-3) merge() : Left Outer Join
> cust_mart_127_leftouter <- merge(x = cust_mart_12, 
+                                  y = cust_mart_7, 
+                                  by = 'cust_id', 
+                                  all.x = TRUE)

> cust_mart_127_leftouter
  cust_id last_name buy_cnt
1     c01       Kim      NA
2     c02       Lee      NA
3     c03      Choi       3
4     c04      Park       1
5     c05       Bae       0
6     c06       Kim       7
7     c07       Lim       3 
 

 

(3-4) merge() : Right Outer Join

 

> # (3-4) merge : Right Outer Join
> cust_mart_127_rightouter <- merge(x = cust_mart_12, 
+                                  y = cust_mart_7, 
+                                  by = 'cust_id', 
+                                  all.y = TRUE)

> cust_mart_127_rightouter
  cust_id last_name buy_cnt
1     c03      Choi       3
2     c04      Park       1
3     c05       Bae       0
4     c06       Kim       7
5     c07       Lim       3
6     c08             4
7     c09             1 


출처: https://rfriend.tistory.com/51 [R, Python 분석과 프로그래밍 (by R Friend)]

#변수명,이름,글자 합치기 
사용예시) paste0("match_",i,".txt")
"match_" 라는 문자와 i에 해당하는값 ".txt"라는 문자를 합쳐라.
ex) i<-a1 일때, match_a1.txt가 출력된다.

 

#행/열 이름 추가
행 또는 열의 이름을 추가해주는 함수.
1.rownames(df) <- c("fruits","meats")
2.colnames(df) <- c("fruits","meats")
둘 다 순서대로 fruits, meats라는 이름의 행 / 열을 추가해줌.

#분석
1.table() 함수
데이터의 빈도를 나타내주는 함수.
사용예시) table(sick_sym2002$SICK_SYM)
추가 팁) data.frame(table(sick_sym2002$SICK_SYM)) data.frame을 앞에 씌워주면 바로 데이터테이블 형태로 만들어짐.

2.length() 함수
벡터의 길이 혹은 해당컬럼의 개수를(총몇 행인지) 세는 함수.

3.dim() 함수
데이터프레임의 개수를 세는 함수, 행과 열 모두 출력해줌

4.nrow() , ncol()
nrow()는 데이터프레임의 행의 개수를 출력, ncol()은 데이터프레임의 열의 개수를 출력


#중복관리[distinct, unique,duplicated]

1.unique() 함수
중복된 값을 삭제해준다
사용예시)unique(t2040_filtered[,c(3,1)])
t2040_filtered라는 df에서 3열과 1열을 기준으로 중복체크하여 중복을 삭제하라 (1,3으로 하지 않은 이유는 먼저적은 숫자가 앞에 정렬됨)


#저장
write.table("저장할디렉토리/파일명.txt", row.names = FALSE, col.names = TRUE, quote = FALSE, sep = "\t", append = TRUE)
# 자료형 변환
as.character() 문자형
as.complex() 복합형
as.numeric() 숫자형
as.double() 숫자형(소수점)
as.integer() 정수형
as.logica() 논리형
#자료구조 변환
as.data.frame()
as.list()
as.matrix()
as.vector()
as.factor()

#결측값 관리
1. 결측값 표시 is.na
2. df의 각 변수의 결측값을 변수별 평균으로 대체
sapply(dataset, function(x) ifelse(is.na(x), mean(x, na.rm=TRUE), x)) 
3. 데이터프레임의 모든 행의 결측값을 특정 값(가령, '0')으로 일괄 대체
dataset[is.na(dataset)] <- 0 
4.결측값을 다른 값으로 대체
dataset$var[is.na(dataset$var)] <- new_value 
5.결측값이 들어있는 행 전체를 데이터 셋에서 제거
na.omit()
6.결측값을 통계 분석 시 제외(미포함)
na.rm = TRUE
7.결측값이 총 몇 개인지 계산
sum(is.na())

##전역(global environment)/국소옵션(local)
options(scipen=xxx)
format(car, scientific = FALSE)

##소확팁
(head), (tail) - 너무 많은 데이터일 경우 상위, 하위 10개 표시
str() 데이터 타입 확인
getwd()
setwd()
rm(list=ls()) - remove all environment
& = and
| = or
! = not
정규표현식


##패키지 소개
1."dplyr"
주요 함수


함수명
filter() 지정한 조건식에 맞는 데이터 추출 subset()
select() 열의 추출 data[, c(“Year”, “Month”)]
mutate() 열 추가 transform()
arrange() 정렬 order(), sort()
summarise() 집계 aggregate()


2."data.table"
2.1 Data load dt <- data.table(rbind(airquality,airquality,airquality,airquality))

2.2 New Column
 dt[,test:="chk"] dt[Ozone < 30, test:="None"] dt[
,Date:=as.Date(paste('2015', as.character(Month), as.character(Day), sep='/'),'%Y/%m/%d')] 

2.3 Search
 dt[Ozone < 30] dt[Solar.R > 150 & Ozone < 20 ] dt[
Ozone %between% c(11,14)] dt[test == "None"] dt[test %like% "^N"] dt[test %chin% "None"] 

2.4 Join
 DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6),
 v=1:9) setkey(DT, x) X = data.table(c("b","c"),foo=c(4,2)) DT[X] DT[X,sum(v), by=x] 

2.5 Expression
 DT[,sum(v), by=.(y%%2)] DT[,v/sum(v), by=x] DT[,length(y)/nrow(.SD), by=y]

출처: https://bongury.tistory.com/entry/R-Datatable-공부 [봉구리밥스]


##기타꿀팁
#폴더 내 파일리스트 불러오기
사용예시) file_list <- list.files(path = ".", pattern = NULL)
path 경로의 pattern패턴의 파일리스트를 전부 file_list로 호출. pattern에 정규표현식을 써서 해당하는 형태만 불러올 수 있음.


붙이기(paste)
%in% = 한 변수에서 여러개의 데이터를 불러 올 때.
ex) df%>% filter(col %in% c(130, 2222, 12112)) #df에서 filter컬럼의 값이 130, 2222, 12112인 행을 추출

*.결측값으로 인해 파일 불러오기가 안될 때 대처법
fill = TRUE 옵션을 이용 단, 결측값이 행의 마지막 값일때만 사용할 것
(R이 모든 값을 앞으로 당기고 비어있는 열에 NA을 넣음)

 

'반영훈' 카테고리의 다른 글

[JS] 콜백(callback)함수  (0) 2020.08.13
[엑셀활용]code_list 분할  (0) 2019.09.02
엑셀 같은 함수식 모든열에 적용  (0) 2019.08.25
[주니어 개발자] 좋은 질문하기  (0) 2019.08.21
[Team-lab] Data loadmap  (0) 2019.08.05

댓글