교육/빅데이터 청년인재_경희대 R

R 정형 데이터 분석_전처리(dplyr)03

HB HB 2019. 7. 15. 21:41

#연습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),]