ADsP/3과목

[3과목] 3-2. R기초 (2) 매트릭스 & 데이터프레임

RECORD WHO (레코드후) 2022. 9. 18. 13:36

#2차원 데이터의 저장

 

[매트릭스/ 행렬]

matrix: 전체의 데이터 타입이 동일한 구조여야 함. (숫자로만 or 문자로만) 

- 행과 열이 존재

- nrow 행의수 / ncol 열의수 = 지정을 통해서 행과 열의 갯수 설정 가능 

- 근데 행열을 직접 만드는 경우는 거의 없이 데이터를 파일에서 불러옴 

z <- matrix(1:20, nrow=4, ncol=5)

z2 <- matrix(1:20, nrow=4, ncol=5, byrow=T)
1:20 은 행렬/매트릭스의 저장될 값(1~20)을 지정한 것이다.
nrow=4는 매트릭스 행의 수, ncol=5는 매트릭스 열의 수를 의미한다.


매트릭스에 저장될 값들을 행 방향으로 채우기 : " byrow=T "

 두 개의 벡터를 행 방향으로 묶어주는 함수 : rbind()

> m2 <- rbind(x,y)
> m2

두 개의 벡터를 열방향으로 묶어주는 함수 : cbind()

> m1 <-cbind(x,y)
> m1

 

[데이터프래임 data frame]

- 숫자와 문자를 섞어서 저장 가능, 하지만 column 내에서는 동일한 타입이어야! 

-data.frame() 함수로 생성

ciry <- c("Seoul","Tokyo","Washington")       #문자로 이루어진 벡터
rank <- c(1,3,2)                                             #숫자로 이루어진 벡터
city.info <- data.frame(city, rank)                #데이터프레임 생성
city.info                                                         #city,info의 내용 출력

 

[데이터 추출 함수 (매트릭스, 데이터프레임 둘다 적용가능)]

함수 의미
rownames() 행의 이름을 출력
colnames() 열의 이름을 출력
dim() 행과 열의 개수를 출력
nrow() 행의 개수를 출력
ncol() 열의 개수를 출력
head() 시작부분에 있는 일부데이터(5개)출력
tail() 끝부분에 있는 데이터 일부 출력
str() 매트릭스, 데이터프레임의 요약 정보를 출력
unique() 그룹(종류)의 값이 저장된 벡터에서 중복을 제외하고 그룹 확인
table() 그룹(종류)의 값이 저장된 벡터에서 각 그룹별로 몇 개의 관측치가 존재하는지 출력한다 ( 도수분포표 )

 

[행과 열의 합계와 평균]

함수 의미  
colSums() 열별 합계를 출력한다. colSums(iris[,-5]) #열별 합계 
rowSum() 행별 합계를 출력한다. rowSums(iris[,-5]) #행별 합계
colMeans() 열별 평균을 출력한다. colMeans(iris[,-5]) #열별 평균
rowMeans() 행별 평균을 출력한다. rowMeans(iris[,-5]) #행별 평균 *[,-5]  : 5번째 열은 제외하고
t() 행방향과 열방향을 변환한다. transpose
subset() 조건에 맞는 행을 추출한다. subset(대상,행추출조건)함수
class() 자료구조를 확인한다.  
is.matrix() 행렬(matrix) 여부를 확인한다. is.matrix(iris)   #TRUE/FALSE 로 답 나올것
is.data.frame() 데이터프레임 여부를 확인한다. is.data.grame(iris)   #TRUE/FALSE

 

*추가설명) T() 함수: 행과열 변환하기 (transpose)

- 설문조사 데이터 등 분석하기 어려운 형태일 때 't'함수로 변환

z<-matrix(1:20,nrow=4,ncol=5)
z
t(z)

 

*추가설명) subset(대상,행추출조건)함수 : 조건에 맞는 행(row) 추출

*matrix를 subset하고 싶다면, dataframe으로 바꾼 후 하기 

IR.1 <- subset(iris, Species=="setosa")  
IR.1
IR.2<-subset(iris,Sepal.Length>5.0&
                            Sepal.Width>4.0)
IR.2
#대상, 행추출조건 (Iris 데이터셋에서 품종정보가 setosa인 행만 뽑아서)
#IR.1에저장

#조건1이 sepal.Length가 5보다 크고 &(and의의미)
#조건2 sepal.width가 4보다 큰 데이터들을 뽑아 IR2에 저장

*하나의 명령문은 한 줄에 작성하는 것이 일반적이나, 명령문이 긴 경우는 여러줄에 걸쳐서 작성 하되

여러줄에 걸칠 때는 연결부(%나',' 등)을 앞부분 명령문에 남겨두어야 뒤에 이어지는 문장이 있음을 알 수 있음

 

Matirx간에도 사칙연산이 가능 (단, 행/열의 수가 동일할 때)

단순히 a*b는 대응되는 행/열 값끼리 곱하는 것이고 

수학시간에 배운 행렬곱셈은 %*%를 이용

3*a    #매트릭스a에 들어있는 모든 원소에 3을 곱하기
b-5    #매트릭스b에 들어있는 모든 원소에 5를 빼기 
a<-3*a     #원소에 계산한 값을 매트릭스a에 다시 저장하는 것
cf)위에서는 그냥 계산만하는 건데, 'a<- ' 이렇게 저장함으로써 아예 매트릭스의 데이터 자체를 변경하는 것 

 

[매트릭스 vs 데이터프래임]

1) 데이터프래임을 매트릭스로

iris.m<-as.matrix(iris[,1:4])
head(iris.m)
class(iris.m)
#iris라는 df를 (전체행,1~4열까지의 데이터) 추출해서 매트릭스로 변환해라
#head
#class로 자료 구조 확인해보는 것
tmp<-iris[,-5]
class(tmp)
tmp2<-as.matrix(tmp)
class(tmp2) 
#iris에서 -5 wmr 5번째 열을 제외한 나머지를 tmp라고 하는 자료구조에 저장
#class를 통해 tmp의 자료구조가 뭔지 확인
#tmp를 as.matrix로 변환해서 tmp2에 저장
#tmp2의 자료구조를 다시 확인해보면? 매트릭스라는 값이 나올 것 

2) 매트릭스를 데이터프래임으로 

st<-data.frame(state.x77)
head(St)
class(St)
 

*R함수의 입력형식 확인

-매트릭스 또는 데이터프레임 중 특정포맷을 요구하는 함수가 존재

-요구하는 포맷이 아닌 경우 계속 에러가 뜸

-이럴 땐 HELP 기능으로 매뉴얼을 통해 확인 

 

[파일에서 데이터 읽어오기 - 저장되어 있는 파일] 

엑셀에서 .CSV 포맷으로 저장 (콜롬과 콜롬을 콤마로 구분한 형태의 텍스트 파일을 의미) 

read.csv("읽으려는파일이름", 첫줄(header)의 정보로 열이름이 따로 있으면 true/ 없으면 false로 지정하면됨) 

setwd("C:/Rworks")
mydata<-read.csv("test.csv",header=TRUE)
mydata
head(mydata)
tail(mydata)


mydata[2,3]
nrow(mydata)
ncal(mydata)
dim(mydata)


mRow1<-mydata[2,]
mRow2<-mydata[,3]
#파일있는 폴더지정 / wd는 working directory의미/ C드라이브의 Rworks라는 폴더에 파일이 들어가있다
# read.csv (test.csv라는 파일, 열이름존재) 이걸 mydata에 저장해라
# mydata의 전체 데이터 출력
# 앞의 몇 줄 데이터만 출력
#뒤의 몇 줄 데이터만 출력

#2행 3열의 원소값 출력
#행의 개수 출력
#열의 개수 출력
#행, 열의 개수 출력

#2행의 값들을 추출해서 벡터생성
#3열의 값들을 추출해서 벡터생성

 

[파일에 데이터 저장]

write.csv(저장할변수(배열), 저장될파일이름(setwd에서 지정한 폴더에 저장됨), 행이름 붙일지, 문자열저장)

mynew<-mydata[,c(2,3)]
write.csv(mynew,kid_new.csv", row.names=F, quote=F)
#mydata에서 2,3번째 콜롬만 잘라서 mynew라는 새로운 배열 생성
#mynew배열을 파일로 저장

-저장할 변수가 뭔지
-어떤 파일에 저장하는 지
-행 이름 붙일지 말지
-문자열에 "" 붙일지 말지
(quote는 어떤 열에 문자열이 들어가 있는데 그 문자열에 공백 존재 시 새로운 콜롬으로 인식 될 가능성이 있기 때문에 하나의 단어라는 뜻으로 따옴표를 붙이는데 그걸 할지 말지를 지정하는 값)

 

[읽고 쓸 파일을 지정하는 여러가지 방법] 

1) 파일이 있는 폴더를 지정 setwd("C:/Rworks")   
mydata <- read.csv("test.csv", header = TRUE)
mydata
2) 저장된 path 전체를 지정 
: Setwd 없이 바로 읽고 쓰는 방법임
mydata <- read.csv("C:/Rworks/test.csv", header = TRUE)
3) 파일 탐색기 등으로 찾아서 읽어오기
:파일 탐색 기능 함수를 사용
mydata <- read.csv(file.choose(), header = TRUE)

 

[리스트]

-벡터와 비슷하지만, 여러 자료형의 데이터를 섞어서 저장 가능

-심지어 벡터나,데이터프래임 등도 원소로 저장이 가능

-리스트에서 요소값을 불러올 때는 반드시 꺽쇠 2개 사용 [[숫자]] 

member[[1]]
member$name
[]로 불러오면 저장한 type이 아니라 list형태로 결과 추출됨
[[]]로 불러와야 원소값 가져올 수 있음 

 

[팩터(factor)]

-벡터와 유사한 구조의 문자형 변수 (숫자는 x)

- 특정 종류의 값만을 가질 수 있는 데이터 타입으로 factor() 함수 이용해서 생성 가능

*예) 혈액형 타입을 수집 변수가 취할 수 있는 값은 A,B,AB,O 다른 종류의 문자는 에러 

blood.type<-factor(c("A","A","AB","O","B"))
blood.type
is.factor(blood.type)
# factor() 함수 통해 변수값을 팩터타입으로 변환해라
그럼 저 변수에 있는 값들로만 앞으로 들어갈 수 있는 데이터가 픽스됨 
만약 D라는 값 집어넣게 되면 에러 뜸 

-팩터는 label 순서대로 숫자로 변환 가능함

blood.type
as.numeric(blood.type)

>blood.type
[1] A A AB O B
Levels: A AB A O
>as.numeric(blood.type)
[1] 1 1 2 4 3 
Levels : blood type에는 A, AB, B, O만 올수 있다

as.numeric : 숫자로 치환하라
Levels에 있는 순서대로 숫자로 변경됨