5시간코딩

[R] 테이블 가공 관련 각종 함수 정리 ** 본문

R(3.4.3)/[R] 기초

[R] 테이블 가공 관련 각종 함수 정리 **

5시간코딩 2019. 2. 12. 00:18

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")