[R] 테이블 가공 관련 각종 함수 정리 **
emp<-read.csv("c:/data/emp.csv",header=T,stringsAsFactors = F)
dept<-read.csv("c:/data/dept.csv",header=T,stringsAsFactors = F)
■ 테이블 가공 관련 각종 함수
1. 행열 추출
1) |
emp[ , c(' ' , ' ')] |
특징 : NA값 나옴 |
2) |
subset( , , select = c( , )) |
특징 : NA값 안나옴. 장점 : 특정 컬럼 제외가 쉬움( - 붙임) |
1) emp[ emp$DEPARTMENT_ID==20 , c('EMPLOYEE_ID','LAST_NAME')]
2) subset(emp , DEPARTMENT_ID==20 , select = c(EMPLOYEE_ID, LAST_NAME)
2. 정렬
1) | rank( ) |
|
2) | sort( ) |
|
3) | emp( order( )) | 장점 : 벡터형에서 좋음. |
4) | orderBy( ~ , ) :: doBy | 장점 : data.frame 에서 좋음. 단점 : 데이터에 없는 컬럼 사용 불가 |
1) rank(-emp$SALARY)
2) sort(emp$SALARY)
3) emp(order(emp$SALARY))
4) orderBy(~SALARY, emp)
3. 그룹/중복제거
1) | unique( ) | 특징 : 중복제거. 단점 : 함수적용불가 |
2) | aggregate( ~ , , ) | 특징 : NA 안나옴 |
3) | ddply( , ' ' , summarise , ) | 특징 : NA 나옴, 단점 : 그룹지을 기준컬럼을 가공할 경우 사용 못함. ex) 년도별 급여합(HIRE_DATE에서 년도만 뽑아내야 하는데 ' ' 안에 있어서 수정이 불가능 |
4) | melt 후 dcast | 자세한건 5번 참고 |
5) | tapply( , , ) | 특징 : 기준컬럼이 1개일 경우 행방향 출력됨. |
1) unique(emp[,c('DEPARTMENT_ID','JOB_ID')])
2) aggregate(SALARY ~ DEPARTMENT_ID, emp, sum)
3) ddply(emp, 'DEPARTMENT_ID', summarise, sumsal= sum(SALARY))
4)
5) as.data.frame(tapply(emp$SALARY, emp$DEPARTMENT_ID, sum))
4. 분석함수
1) | ddply( , ' ' , transform , ) |
1) ddply(emp, 'DEPARTMENT_ID', transform, sumsal= sum(SALARY))
5. (엑셀의)피봇테이블 형태 / 기준컬럼을 기준으로 한줄로 가공
1) | melt( , id= ' ' ) | |
2) | dcast( , + ~ , ) |
|
e<-emp[,c("DEPARTMENT_ID","JOB_ID","SALARY")]
1) m<-melt(e, c('DEPARTMENT_ID','JOB_ID'))
2) dcast(m, DEPARTMENT_ID ~ variable, sum) #그룹함수와 같은 효과
dcast(m, DEPARTMENT_ID+JOB_ID ~ variable, sum) #원상복귀
6. 크로스테이블
1) | tapply( , list( , ) , ) | 특징 : 기준컬럼은 list 나 data.frame 형만 가능. 결과는 array형으로 나옴. |
1) tapply(emp$SALARY, list(emp$JOB_ID,ifelse(is.na(emp$DEPARTMENT_ID),'부서없음',emp$DEPARTMENT_ID)), sum)
7. 분할표(빈도수 체크)
1) | table( , ) | 단점 : 크로스테이블과 다르게 SUM만 됨. |
2) | xtabs( ~ , ) | 단점 : 크로스테이블과 다르게 SUM만 됨. |
3) | margin.table(x,1) // margin.table(x,2) | 행방향의 합 // 열방향의 합 |
4) | prop.table(x,1) // prop.table(x,2) // prop.table(x) | 행의 비율 // 열의 비율 // 전체 중 비율 |
1) table(emp$DEPARTMENT_ID)
table(emp$JOB_ID,emp$DEPARTMENT_ID)
2) xtabs(~JOB_ID,emp)
xtabs(~JOB_ID+DEPARTMENT_ID,emp)
3) margin.table(x,1) // margin.table(x,2)
4) prop.table(x,1) // prop.table(x,2) // prop.table(x)
8. apply 계열
1) | apply( 2차원 , 1or2 , ) | 1:행방향, 2:열방향. |
2) | lappy( , ) | 결과:리스트 |
3) | sappy( , ) | 결과:벡터 |
4) | tapply( , , ) | 자세한건 6번 참고 |
5) | rowSums( 2차원 ) // colSums( 2차원 ) // rowMeans ( 2차원 ) // colMeans( 2차원 ) | sum과 mean밖에 없음. |
1) apply(emp[,c('SALARY','SALARY')],1,sum)
2) sapply(emp$LAST_NAME,nchar)
3) sapply(emp$LAST_NAME,nchar)
4) 자세한건 6번 참고
5) colSums(e[,c(1,3)])
9. 조인
1) | merge( , , by= , all.x = ) |
|
1) merge(emp, dept, by='DEPARTMENT_ID', all.x=T)[,c('EMPLOYEE_ID','DEPARTMENT_ID')]
■ 많은 기능을 가지고 있는 패키지
1. dplyr
오라클 select 문에 있는 기능들, 컬럼추가 기능 있음
emp%>%
filter(DEPARTMENT_ID!=50)%>%
select(EMPLOYEE_ID, LAST_NAME, SALARY,COMMISSION_PCT, JOB_ID)%>%
mutate(MONNY=SALARY+ifelse(is.na(COMMISSION_PCT),0,COMMISSION_PCT))%>%
group_by(JOB_ID)%>%
summarise_if(is.numeric,c(sum,mean),na.rm=TRUE)
#summarise_at(c('EMPLOYEE_ID','SALARY'),sum)
#summarise(SUM_SAL=sum(SALARY))
2. sqldf
- 안되는 것들 : 분석함수, 형변환함수, dual, right outer join, full outer join
- 차집합 minus 아니고 except임.
sqldf("select * from emp")