R 정형 데이터 분석_전처리(dplyr)03
#연습4 head(mtcars) lm=lapply(mtcars,sum) unlist(lm) sapply(mtcars,sum) #연습5 a=tapply(mtcars$hp, mtcars$vs==0, mean) a[1]-a[2] unlist(split(mtcars,mtcars$gear==3)) unlist(split(mtcars,mtcars$gear==4)) unlist(split(mtcars,mtcars$gear==5)) tapply(mtcars$hp,mtcars$gear,mean) ###행과 열 병합 ##행병합 rbind x=c(1,2,3,4,5) y=c(10,20,30,40,50) a=data.frame(x,y);a rbind(a,c(6,60)) rbind(a,c(7,'setosa')) i=head(iris) rbind(i,c(2.3,3.2,4.5,1.2,'batosa')) str(i) #팩터인경우 문자 추가X d1<-data.frame(Sepal.Length=1,Sepal.Width=2,Petal.Length=3,Petal.Width=4,Species ="setosa") d2<-rbind(iris,d1) d2 ##열병합 cbind : 시그니처 테이블 생성할 때 -기본적으로 매트릭스 형태로 생성됨 iris.sepal.lw<-cbind(iris$Sepal.Length,iris$Sepal.Width);head(iris.sepal.lw) class(iris.sepal.lw) x=c(1,2,3,4,5) y=c(10,20,30,40,50) z=c('m','m','m','f','f') d=data.frame(x) d=cbind(d,y,z);d class(d) str(d) #캐릭터형태였던 z가 factor로 추가됨. factor로 하지 않으려면 stringsAsFactors=F해주기 d=cbind(d,y,z,stringsAsFactors=F) str(d) d=data.frame(x) d$y=y d$z=z ; d str(d) data.frame(iris$Sepal.Length,iris$Sepal.Width,iris$Species) ##merge name=c('James','Mary','Jhon') math=c(70,80,90) d1=data.frame(name,math) name=c('James','Jhon','Mary') english=c(80,70,90) d2=data.frame(name,english) merge(d1,d2) data.frame(d1,d2) name=c('James','Mary','Jhon') math=c(70,80,90) age=c(23,24,25) name=c('James','Jhon','Mary') english=c(80,70,90) age=c(23,25,24) d3=data.frame(name,age,math) d4=data.frame(name,english,age) merge(d3,d4) merge(d3,d4,by='name') #다른 똑같은 컬럼 두번 나옴. merge(d3,d4,by='age') #곹오 컬럼은 가급적 하나인 것이 좋다 name=c('James','Mary','Jhon','lion') math=c(70,80,90,100) age=c(23,24,25,32) name=c('James','Jhon','Mary') english=c(80,70,90) age=c(23,25,24) d5=data.frame(name,age,math) d6=data.frame(name,age,english) merge(d5,d6,all=T) #공통이 없는 부분 역시 출력됨(없는 부분은 결측치로) merge(d5,d6,all=F) #공통이 없는 행은 빠짐, 기본값 t=read.csv('train.csv') selected=data.frame(t$Pclass,t$Sex,t$Age,t$SibSp,t$Parch,t$Fare,t$Embarked) colnames(selected)<-c("Pclass","Sex",'Age',"SibSp","Parch","Fare","Embarked") head(selected) te=read.csv('test.csv') selected_test=data.frame(te$Pclass,te$Sex,te$Age,te$SibSp,te$Parch,te$Fare,te$Embarked) colnames(selected_test)<-c("Pclass","Sex",'Age',"SibSp","Parch","Fare","Embarked") head(selected_test) all_data=rbind(selected,selected_test) head(all_data) write.csv(all_data,'all_data.csv') #cbind이용 selected=with(train,cbind(Pclass,Sex,Age,SibSp,Parch,Fare,Embarked)) #train데이터셋추출 selected_test=with(test,cbind(Pclass,Sex,Age,SibSp,Parch,Fare,Embarked)) #test데이터셋추출 d1=data.frame(selected) #selected데이터프레임화 d2=data.frame(selected_test) #selected_test데이터프레임화 all_data=rbind(d1,d2) #합침 head(all_data) summary(all_data) summary(t) ##summary 기초통계량 summary(iris) summary(iris$Sepal.Length) summary(iris$Species) ##summaryBy / tapply와 비슷 install.packages('doBy') library(doBy) summaryBy(Sepal.Length~Species,iris) #해당컬럼에 대하여 species별로 요약 summaryBy(Sepal.Length+Sepal.Width~Species,iris) ###정렬 컬럼 ##sort x=c(1,30,22,27,51,38,45) sort(x) sort(iris$Sepal.Length) sort(iris$Sepal.Length,decreasing = T) #내림차순 ##order : 정렬 후에 순서 순위를 제시(인덱스를 받는 것) iris$Sepal.Length i=order(iris$Sepal.Length) iris$Sepal.Length[i] i=order(iris$Sepal.Length,decreasing = T) iris$Sepal.Length[i] iris[order(iris$Sepal.Width),] #sepal.width기준으로 정렬 iris[order(iris$Sepal.Width,iris$Petal.Width),] #두개를 기준으로 ##with(data,fx) - ifelse와 함께 쓰이는 경우 많음,효과적 with(iris,sum(Sepal.Length)) sum(iris$Sepal.Length) with(iris,ifelse(Sepal.Length>5.0,'High','Low')) iris$Sepal.Length.Judge=with(iris,ifelse(Sepal.Length>5.0,'High','Low'));head(iris) within(iris,ifelse(Sepal.Length>5.0,'High','Low')) within(iris,Sepal.Length<-ifelse(Sepal.Length>5.0,'High','Low')) data(iris);iris[1,1]=NA;head(iris) per_species=split(iris$Sepal.Length,iris$Species) #종별로 분류 median_per_species=sapply(per_species,median,na.rm=T) #종별로 중앙값 class(median_per_species);head(iris) iris=within(iris,Sepal.Length<-ifelse(is.na(Sepal.Length),median_per_species[Species],Sepal.Length)) with(iris,{print(mean(Sepal.Length)) print(mean(Sepal.Width)) }) head(mtcars) sort(mtcars$hp,decreasing=T) sort(mtcars$mpg) mtcars[order(mtcars$hp,decreasing=T),] mtcars[order(mtcars$gear,decreasing=T,mtcars$cyl),] View(mtcars) rev.mtcars=t(mtcars) #마지막에 이름 구하기 위함 mm=rbind(mtcars$cyl,mtcars$gear) tt=t(mm) tt=as.data.frame(tt) ll=lapply(tt$V1+tt$V2,sum) ll=as.data.frame(ll) rev.mtcars=t(mtcars) final.rev.mtcars=as.data.frame(rev.mtcars)#마지막에 이름 구하기 위함 mm=rbind(mtcars$cyl,mtcars$gear) tt=t(mm) tt=as.data.frame(tt) ll=lapply(tt$V1+tt$V2,sum) ll=as.data.frame(ll) save=c() #인덱스 저장 위한 빈 벡터 k=1 #벡터 인덱스 카운 for(i in 1:32){ if(ll[i]==max(ll)){ #ll의 max값과 ll[i]가 같으면 인덱스 값 i를 save에 저장 save[k]=i k=k+1 } } names(final.rev.mtcars[save[]]) ###전처리3_빠른처리 ##Tidy Data : 분석에 적합하도록 표 작성 ##stack 강원=c(200,300,400) 경남=c(400,300,500) 충북=c(600,300,400) sales=data.frame(강원, 경남, 충북) sales sale=stack(sales) summaryBy(values~ind,sale) unstack(sale) install.packages('reshape2') library(reshape2) sales=melt(sales);sales library(doBy) summaryBy(value~variable,sales) dcast(sales,value~variable)#데이터프레임반환 acast(sales,value~variable)#행렬반환 head(french_fries) head(melt(french_fries,id.vars=1:4)) g=melt(french_fries,id.vars=1:4,na.rm=T) Apple=c(6,10,13) Banana=c(2,8,10) Peach=c(7,3,5) Berry=c(8,15,11) Year=c(2000,2001,2002) Fruit=data.frame(Apple,Banana,Peach,Berry,Year) Fruit sf=stack(Fruit) sf class(sf) summaryBy(values~ind,sf) mf=melt(Fruit) summaryBy(value~variable,mf) dmf=dcast(mf,value~variable) class(dmf) amf=acast(mf,value~variable) class(amf) ###data.table name=c('James','MAry','Kevin') age=c(22,23,24) df=data.frame(name,age) df library(data.table) dt=data.table(name,age) dt iris.dt=as.data.table(iris);iris.dt #데이터테이블은 앞뒤 5개씩 보여줌 iris.dt[1:30] class(df) class(dt) str(df) str(dt) #데이터 테이블 접근방법 iris.dt[1,] iris.dt[,1] iris.dt[,Sepal.Length] #따옴표없으면 벡터형태 iris.dt[,'Sepal.Length'] #따옴표있으면 컬럼으로 iris.dt[3,] iris.dt[,3] iris.dt[,'Petal.Width'] #복수컬럼 접근방법 iris.dt[,c(Sepal.Length,Petal.Length)] iris.dt[,c('Sepal.Length','Petal.Length')] iris.dt[1,Species] iris.dt[1,'Species'] iris.dt[1,c(Sepal.Length,Sepal.Width,Species)] iris.dt[1,c('Sepal.Length','Sepal.Width','Species')] #조건식으로 행렬 검색 iris.dt[iris.dt$Petal.Length>1.5, ] iris.dt[Petal.Length>1.0] aggregate(Sepal.Width~Species,iris.dt,mean) tapply(iris.dt$Sepal.Length,iris.dt$Specie,mean) iris.dt[,mean(Sepal.Length),by=Species] iris.dt[,list(my.length=mean(Sepal.Length)),by=Species] ###dplyr library(dplyr) iris%>%head()%>%dim() #행과 열 수 dim x=c(1,2,3,4,5) x2=as.data.frame(x);class(x2) x%>%as.data.frame()%>%class() ##select select(iris,Sepal.Length,Species) iris%>%select(Sepal.Length,Species) ##filter iris%>%filter(Species=='setosa') iris%>%filter(Sepal.Length>5.0) iris%>%filter(Species=='setosa'&Sepal.Length<5.0) ##summarize #컬럼이름 부여 가능 with(iris,mean(Sepal.Length)) summarize(iris,mean(Sepal.Length)) summarize(iris,Sepal.Avg=mean(Sepal.Length)) iris%>%summarize(Sepal.Avg=mean(Sepal.Length)) ##group_by / summarize와 자주사용 /tapply와 비슷 iris%>%group_by(Species)%>%summarize(Sepal.Avg=mean(Sepal.Length)) tapply(iris$Sepal.Length,iris$Species,mean) ##arrange x=c(1,7,5,9,3) sort(x) order(x) sort(x,decreasing = T) order(x,decreasing = T) iris[order(iris$Sepal.Length),] iris%>%arrange(Sepal.Length) PIMA=read.csv('pima-indians-diabetes.csv') head(PIMA) data.table(PIMA) PIMA[100,] PIMA%>%filter(outcome==1)%>%summarize(mean(인슐린)) PIMA%>%filter(outcome==1)%>%summarize(mean(BMI)) PIMA%>%group_by(outcome)%>%summarize(mean(수축기)) PIMA%>%group_by(outcome)%>%summarize(mean(이완기)) PIMA[order(PIMA$BMI,decreasing = T),] |