학교공부/탐색적자료분석

2주차_R코드_list/인덱싱/array/자료변환/apply/loof/임의수생성/사용자정의함수/R그래픽스

싱싱한복초이 2024. 3. 18. 00:46

* R에서 배열(array)은 행렬과 유사하지만 2차원 이상의 구조를 가지고 있다는 차이가 있음.

모든 구성 데이터는 동일한 유형이어야 함.

array(데이터벡터,차원의정의,dimnames=list(각 차원에 대한 라벨 벡터)

 

 

## 실습자료 설치

geyser <- read.table("geyser299.txt",header = T)
geyser <- read.table("C:\\Users\\EDA_hg_R\\geyser299.txt",header = T) # 역슬래시 2개 또는 그냥 슬래시 하나 

geyser[1:5,]
hist(geyser$waiting)


# attach와 detach
hist(waiting) # 에러
attach(geyser)
hist(waiting) # 두 개의 언덕을 가지는 특이한 형태의 그래프 
detach(geyser)
hist(waiting)

ls() # dataframe도 오브젝트이다.

# 매트릭스와 데이터프레임의 차이는? 행렬은 동일한 component로 이루어져야함

## list: 다른 유형의 object를 결합할때는 list()를 쓴다. 오브젝트 중심 언어 기능을 위한 핵심 객체유형

x=c(45,32,34,28,80)
y=c(23,37,12,75,65)
a=factor(c(2,3,3,1,3))
levels(a)=c("A","B","C")
M=cbind(x,y);M
D=data.frame(kor=x,math=y,grade=a);D
L=list(kor=x,math=y,grade=a);L # 세개의 벡터를 갖는 함수
L2=list(kor=x,math=y,grade=a,kormath=M);L2
L3=list(kor=x,math=y,grade=a,kormath=M,G=geyser);L3
str(L3)

ls() # list도 오브젝트이다.

# 오브젝트의 종류: 벡터, 매트릭스, 데이터프레임, 배열, 리스트
# 리스트는 모든 오브젝트를 수용한다.

## []인덱싱

y[2]
y[2:4];y[c(2,5)]
M[3,1]
M[,2];M[1,]
D[3,3]
D$grade[3]
L3$grade[3]
L3$G[3,2]

## 배열 array

# 3차원 행렬. 행렬을 쌓아서 만듦
A=array(seq(1,100),c(3,2,2));A
A[3,1,2]

ls() # 배열도 오브젝트이다.
str(A)

##
## 연산2: 자료변환, 어플라이, 루프, 조건, 사용자 정의함수
##

## 자료변환과 데이터 부분세트(19)

x=c(45,32,34,28,80)
y=c(23,37,12,75,65)
d2=list(kor=x,eng=y);d2
d2a=transform(d2,tot=kor+eng);d2a # list로부터 dataframe 만들기
str(d2a)
d3=subset(d2a,tot>100);d3 # data.frame에서 섭셋 구하기

## 순서정열과 순위

x=c(12,6,4,7,8)
y=c(34,26,14,57,92)
sort(x) # 순서로 정렬
order.x=order(x) # 첫번째(제일작은값) 요소의 위치, 두번째 요소의 위치,....제공
x[order.x] # sort와 같은 결과
y[order.x] # y를 x의 순서대로 정렬 예)반 번호순으로 영어점수를 정렬해라
data.frame(no=sort(x),eng=y[order.x])

x1=c(12,12,4,7,8)
rank(x1) #순위, 등수 구하기
rank(x1,ties.method=c("first")) # 등순위 처리 방법 지정
rank(x1,ties.method=c("random")) # 등순위 처리 방법 지정


## apply류

geyser=read.table("geyser299.txt",header=T);# geyser # 간헐온천의 대기시간과 분출시간
apply(geyser,2,median) # 행 또는 열에 함수를 적용 / 2는 열을 의미함 / 평균을 구하고 싶으면 median 대신에 mean, 합을 구하고 싶으면 sum을 쓰면됨. 
hist(apply(geyser,1,sum)) # 한 행의 값들을 더한 새로운 데이터에 대하여 hist로 그려라.
summary(apply(geyser,1,sum)) # 한 행의 값들을 더한 새로운 데이터를 요약하라.
la=lapply(geyser,sum);la # apply의 결과를 벡터가 아닌 리스트로 남기기, 열기준으로 함수 적용
a=apply(geyser,2,median);a # 벡터

## 루프(22)

a=rep(1,20)
for (i in 3:20) a[i]=a[i-1]+a[i-2] # 첫 초기값 두 개가 1인 피보나치 수열
a
a[a<100]


a=rep(1,20);b=rep(1,20)
for (i in 3:20)
{ # 2개 이상의 작업일 경우는 중괄호로 묶는다
  a[i]=a[i-1]+a[i-2]
  b[i]=b[i-1]+(-1)^(i-1)*b[i-2]
}
b
a[a<100]
b[b<100]

## 임의수 생성(23)

x=runif(n=400,min=-1,max=1)
hist(x)
x=rnorm(n=400,mean=0,sd=1) # sigma^2가 아님에 주의
hist(x)
x=rbinom(n=10000,size=100,prob=0.5)
hist(x)
x=rpois(n=10000,lambda=5)
str(x)
table(x) # 빈도표 제공

## 사용자 정의 함수1

skew.and.kurto=function(x)
{ num1=mean((x-mean(x))^3)
denom1=(mean((x-mean(x))^2))^1.5
num2=mean((x-mean(x))^4)
denom2=(mean((x-mean(x))^2))^2
skew=num1/denom1
kurto=num2/denom2-3
return(c(skew,kurto))
}
t5=rt(100000,5) #자유도 5인 t분포를 따르는 1000개의 임의 수
z=rnorm(1000000, 70, 15) #표준정규분포를 따르는 1000개의 임의 수
n.70.10=rnorm(1000000, 70, 10) #표준정규분포를 따르는 1000개의 임의 수
u=runif(100000) #(0,1)구가의 균등분포를 따르는 1000개의 임의 수
round(skew.and.kurto(t5),3)
round(skew.and.kurto(z),3)#10000개는 되어야 0,0 수준으로 근접
round(skew.and.kurto(n.70.10),3)#10000개는 되어야 0,0 수준으로 근접
round(skew.and.kurto(u),3)

## 사용자 정의 함수2

x2=function(x)
{
  y=x^2
  return(y)
}
x2(2)

##
## R그래픽스
##

## 산점도(25)

geyser=read.table("geyser299.txt",header=T) # 간헐온천의 대기시간과 분출시간
attach(geyser)
plot(duration~waiting) # 산점도
plot(duration~waiting,xlim=c(40,110),ylim=c(1,6),xlab="waiting time(min)",ylab="duration(min)",main="Geyser Plot")
plot(duration~waiting,xlim=c(40,110),ylim=c(0.8,6),xlab="waiting time(min)",ylab="duration(min)",main="Geyser Plot", type='n') # type='n'은 좌표를 찍지 않음
# 이상치 식별을 위해 케이스 번호를 입력
text(x=waiting, y=duration, cex=0.75) # cex문자확대인수, 1보다 작으면 축소

## 다중프레임(27)

par(mfrow=c(2,2)) # 행으로 rowwise 하게 채워 나감 # mfrow:multiple frame rowwise
# par(mfcol=c(2,2))도 똑같이 반복

x=runif(n=400,min=-1,max=1)
hist(x)
x=rnorm(n=400,mean=0,sd=1) # sigma^2가 아님에 주의
hist(x)
x=rbinom(n=100,size=10,prob=0.5)
hist(x)

## 그래프 겹치기(29)

par(mfrow=c(1,1))
x=rt(1000,5) # 자유도의 t분포
hist(x,freq=F) # 빈도대신에 밀도를 표시 / freq=F는 density=T
m=mean(x)
s=sd(x)
d1=dnorm(x,m,s) # 정규분포의 확률밀도함수
curve(dnorm(x,m,s),add=T) # add=T를 넣음으로써 그래프를 겹쳐그릴 수 있게 됨.
curve(d1,add=T) # 작동안함,왜?

##
## 데이터 세트 병합, 분할할
##

## 데이터 세트 병합(31)

data1=read.table("mid.txt", header=T);data1
data2=read.table("final.txt", header=T);data2
data1.and.2=merge(x=data1,y=data2,by.x="id",by.y="id"); data1.and.2 # 두 데이타 셋에서 id를 키로하여 병합, cbind는 단순한 붙임
data1.and.2=merge(x=data1,y=data2,by.x="id",by.y="id",all=T); data1.and.2 # 한쪽에 id 만 있어도 포함시킴. 데이타가 빠진 경우는 na표시



## 데이터 세트 분할(30)

qr=c(1,2,1,1,2)
qr=factor(qr)
levels(qr)=c("low","high")
str(qr);qr
score=c(98,82,45,23,74)
score.split=split(score,qr)#score를 요인 qr에 따라 분할. 데이타를 유형별, 지역별로 분할하여 만듬
score.split
score[qr=="low"] #부분세트만들기 기번으로 동일한 결과
score[qr=="high"]

##
## 외부연계, R작업관리(34)
##

## 외부데이터 읽기(33)

read.csv("score.csv", header=T) #엑셀파일 읽을때, csv(comma seperated variable)로 저장하여 읽어들임

library(foreign)
read.spss("stock.sav") #spss 화일 읽기, foreign 라이브러리 로드하여 사용. SAS도 가능

score2=cbind(score,score)
write.table(score2, "score2.txt")
#R console대신에 화일로 아웃풋 쓰기
sink("exer.out") #이후 출력을 이 파일로
summary(score)
sink() #이후 출력을 화면으로
#오브젝트 관리
ls() #로드되어 있는 모든 오브젝트를 보여줌
rm(data1) #오브젝트 삭제
rm(list=ls()) #모두 삭제
#워크스페이스 관리(만든 오브젝트들이 보관 등): 컨솔 메뉴에서 save and load workspace 사용
#실행된 명령문들을 관리: 컨솔 메뉴에서 save and load history 사용
#R 스크립트 관리: 지속 저장 필요. 스크립트 메뉴 활용