관리 메뉴

IT journey

R-데이터 프레임 본문

개인공부공간/R

R-데이터 프레임

step 2021. 6. 4. 22:36
728x90
반응형

직접 내용 정리하고 만든 예이니 퍼가실 때는 출처를 남겨주세요 :)

R 작업공간

R의 작업공간은 작업 디렉터리(폴더)에 임시로 보관합니다.

○현재의 작업 디렉터리를 확인하는 첫번째 방법은 R Studio의 우측하단의 File창에서 확인하는 것이고

두번째 방법은 함수 getwd() 실행하는 것입니다.

○작업공간에 있는임시 저장된 객체 확인하는 방법은

함수 ls() 를 실행하거나 Evioronment 창에서 확인하는 것입니다.

○작업공간을 저장하는 방법은 save.image()를 실행하는 것입니다.

○작업공간을 종료할 때는 q()를 입력하거나 메뉴 File 뒤에 Quit Session으로 종료하는 방법이 있습니다.

○작업공간에서 입력한 명령문은 파일.Rhistory로 저장되는 것이 디폴트(기본 값)입니다.

참고로, 디폴트 작업 디렉터리를 변경하고 싶다면 3가지 방법 중 하나를 택해서 하면 됩니다.

(1)함수 setwd(“~/가고 싶은 폴더”) 실행 (~는 디폴트 디렉터리)

(2)메뉴 Session > Set Working directory > Choose directory

(3)Files 창 메뉴 More > Set as working directory

작업공간에서 모르는 함수가 나올 경우

help(함수이름) 또는 ?함수이름을 쓰게 되면 그 함수에 대한 설명이 간략히 나오니 이용하시면 됩니다.

웹에서의 데이터 불러오기

데이터 불러오는 방법을 알기 전 R의 경로표시 방법에 대해 알아봅시다.

만약 Windows에서의 경로가 "E:₩Admin₩Downloads" 이라면 R에서는 "E:₩₩Admin₩₩Downloads"이 됩니다.

[Wine CSV 파일 불러옵시다.]

https://archive.ics.uci.edu/ml/index.php 에 들어가 Wine 클릭 후 Data Folder를 눌러줍니다. 

그 뒤 wine.data가 있는 것을 확인 후  wine.data에서 마우스 오른쪽을 눌러 링크 주소 복사를 합니다.

그 후 다시 R studio로 돌아옵니다.

wine.url<-"https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data"
wine.data<-read.csv(wine.url,header = FALSE,stringsAsFactors = FALSE)
head(wine.data)

 

read.csv(읽어드릴 파일,header가 있으면 TRUE를 입력하고 없으면 FALSE,구분자) 이런식으로 입력합니다.

이 때, StringAsFactors=FALSE로 지정하면 문자열이 되고 True로 하게 되면 Factors를 String으로 인식합니다. 기본값은 TRUE로 되어있습니다.

그리고 read.csv()라는 의미는 CSV 파일을 데이터 프레임 형식으로 읽는다는 의미입니다.

참고로, write.csv()라는 의미는 데이터 프레임 형식을 CSV 파일로 저장한다는 의미입니다.

이와 유사한 것으로 write.table()있는데 이것은 추가 옵션에 따라 저장되는 형태가 다릅니다.

head에 대한 설명을 보고 싶으시다면 R-데이터 유형과 객체 간략히 살펴보기 에서 봐주시길 부탁드립니다.

데이터 프레임

가장 많이 사용하는 객체로 함수 read.table() 등으로 불러온 외부 파일을 데이터 프레임으로 저장하게 됩니다. 

(1) 데이터 프레임에 쓰이는 함수 with()와 attach()에 대해 알아봅시다.

○ 함수 with()

with(데이터 프레임,R 명령문)

함수 with() 내에서는 필드 이름만으로 접근 할 수 있도록 만들었으므로 지정된 데이터 프레임의 변수를 인덱싱 없이 사용이 가능합니다.

with(iris,{print(max(Sepal.Length))}) #print(max(iris$Sepal.Length))과 같은 의미입니다.
#iris$Sepal.Length에서 iris는 "데이터 프레임 변수"를 Sepal.Length는 "컬럼 이름" 입니다.

참고로, 함수 print()와 함수 cat()에 대해 알아봅시다.

공통된 기능은 객체에 할당된 값을 화면에 나타내줍니다.

함수 print()는 한 번에 한 객체만 출력이 가능해서 아래와 같이 할 경우 에러가 발생합니다.

print("제곱근 40은",sqrt(40),"입니다")

함수 cat()은 객체에 할당된 값을 벡터로만 나타냅니다. 

x<-matrix(1:6,nrow=3)
cat(x)

함수 cat()은 작업결과를 외부로 저장합니다.

#참고로, append는 이어쓰기 여부를 지정하는 것으로
#append=FALSE는 디폴트값으로 덮어쓰는 것을 의미하고
#append=TRUE는 이어쓰는 것을 의미합니다.
#"\n"은 줄바꾸는 것을 의미합니다.
x<-c(1:6)
m.x<-mean(x)
s.x<-summary(x)
cat("Number",x,"\n",file="E:/Admin/Downloads/outfile1.txt")
cat("Mean value is",m.x,"\n",file="E:/Admin/Downloads/outfile1.txt",append=TRUE)
cat("SUMMARY is",s.x,file="E:/Admin/Downloads/outfile1.txt",append=TRUE)

○ 함수 within()

with()와 같지만 데이터를 쉽게 변경할 수 있습니다.

 

○ 함수 attch()

필드 이름 만으로 데이터를 접근하여 여러 줄을 명령문에서 특정 데이터 프레임을 계속 이용할 경우 사용합니다. 주의해야할 사항은 여러 데이터의 변수들 중 변수명이 같을 경우 혼란이 올 수 있습니다.

○ 함수 detach(데이터명)

필드 이름 데이터 접근을 해제합니다. 

(2) 데이터 프레임에 새 변수 생성 해봅시다.

숫자형 변수를 생성하는 방법은 3가지가 있습니다.

① 함수 with()에 의한 방법

x<-data.frame(x1=c(1:4),x2=c(2:5),x3=(3:6))
x$sum_x<-x$x1+x$x2+x$3
x$sum_x<-x$x1+x$x2+x$x3
x$avg_x<-with(x,(x1+x2+x3)/3)
x

② 함수 transform()에 의한 방법

x<-data.frame(x1=c(1:4),x2=c(2:5),x3=(3:6))
x<-transform(x,sum_x=x1+x2+x3,avg_x=(x1+x2+x3)/3)
x

③ 함수 within()에 의한 방법

x<-data.frame(x1=c(1:4),x2=c(2:5),x3=(3:6))
x<-within(x,
{
sum_x<-x1+x2+x3
avg_x<-(x1+x2+x3)/3
})
x

#이 숫자형 변수를 요인으로 변환해봅시다.
#데이터  프레임$변수를 사용한 예입니다.
x$type[x$sum_x<9]<-"Small"
x$type[x$sum_x>=9]<-"Large"
x$type<-factor(x$type,order=TRUE,level=c("Small","Large"))
x

#함수 within()을 사용한 예입니다
x<-within(x,
{
type<-character(0)
type[sum_x<9]<-"Small"
type[sum_x>=9]<-"Large"
type<-factor(type,order=TRUE,levels=c("Small","Large"))
})
x

(3) 데이터 프레임에 행 또는 열을 추가해봅시다.

○ 함수 rbind()와 cbind()를 쓸 경우에는 데이터 프레임이 꼭 있어야 합니다.

x<-data.frame(x1=2:5,x2=6:9,x3=10:13)
rbind(x,data.frame(x1=1,x2=2,x3=3)) #행 단위로 추가
cbind(x,data.frame(x1=4,x2=5,x3=6)) #열 단위로 추가

- 행 단위로 추가할 때 길이가 다르다면 순환법칙을 적용합니다.

- 열 단위로 추가할 경우는 행의 개수는 반드시 같아야 합니다!!

참고로, 열 이름을 수정 해봅시다.

수정할 때 쓰는 함수는 names()와 함수 rename()이 있습니다.

x<-c("turtle","rabbit","monkey")
y<-c(200,5,20)
z<-c("Fish","hay","banana")
df1<-data.frame(x,y,z) 
#함수 names()로 변수 이름 지정하기
names(df1)<-c("animal","age","feed")

#함수 rename() 이용해 변수 이름 지정하기
install.packages("reshape")
library(reshape)
df1<-rename(df1,c(x="animal",y="age",z="feed"))
df1

names()는 이름을 할당하는 문자형 데이터의 길이가 변수의 개수가 같아야 합니다.변수가 많고 그 중 일부만 수정할 때는 좋지 않습니다.반면 renames()은 변수가 많고 일부만 수정이 가능합니다.

(4) 데이터 프레임을 정렬 해봅시다.

우선, 벡터를 정렬해봅시다.

R-벡터,행렬 편에서는 벡터를 추가하고 일정한 수열을 만들고 연산했으니 참고부탁드립니다.

벡터를 정렬하는 함수는 sort(변수)와 order(변수)이 있습니다.

x<-c(25,29,23,28,NA,30,26)
sort(x) #오름차순
sort(x,decreasing = TRUE) #내림차순

order(x)
x[order(x)] #오름차순
x[order(-x)] #내림차순

sort(변수)와 order(변수)의 차이를 알아봅시다.

sort(변수)는 옵션으로 decreasing이 있어 내림차순으로 하고싶을 경우 decreaing=TRUE를 이용합니다.

디폴트 값으로는 decreaing=FALSE를 갖고있습니다.

order(변수)는 각 요소들의 정렬 순서를 반환해줍니다. 또한 NA의 정렬 순서도 반환해줍니다.

order(변수)를 인덱싱을 해주면  오름차순을, 변수에 -를 붙여 인덱싱을 해주면 내림차순으로 보여줍니다.

 

그렇다면 여기서 나온 NA에 대해 궁금하실 꺼라 생각듭니다. 

NA(Not Available)는 결측값이라며 부르며, 이것은 데이터가 누락된 거나 조작자가 실수로 작성하지 않은 것을 말합니다. 만약 많은 데이터가 있다면 이 NA가 있는지 없는지 눈으로 찾기가 어려울 겁니다.

그래서 그것을 찾아주는 함수(is.na())가 있습니다. 만약 그것을 없애지 않고 데이터를 계산하게 되면 NA값을 가져옵니다. 그래서 그것을 없애주는 옵션(ra.rm=TRUE)이 있습니다.

그에 대한 예는 아래와 같습니다.

x<-c(25,29,23,28,NA,30,26)
is.na(x)
mean(x)
mean(x,na.rm=TRUE)

이제, 데이터 프레임을 정렬해봅시다.

#animal을 기준으로 오름차순을 한 예입니다.
x<-c("turtle","rabbit","monkey")
y<-c(200,5,20)
z<-c("Fish","hay","banana")
df1<-data.frame(x,y,z) 
names(df1)<-c("animal","age","feed")
df1[order(df1$animal),]

#여러 변수를 순차적으로 기준 설정하여 정렬한 예입니다.
#1차 오름차순은 feed로,2차 오름차순으로 age로,3차 오름차순은 animal로 했습니다.
df1<-data.frame(animal=c("turtle","rabbit","monkey"),age=c(200,5,20),feed=c("Fish","hay","Banana"))
df1[order(df1$feed,df1$age,df1$animal),]
#with를 활용한 예입니다.
with(df1,df1[order(feed,age,animal),])
#1차 오름차순은 animal로,2차 오름차순으로 feed로,3차 내림차순은 age로 했습니다.
df1<-data.frame(animal=c("turtle","rabbit","monkey"),feed=c("Fish","hay","Banana"),age=c(200,5,20))
df1[order(df1$animal,df1$feed,-df1$age),]
with(df1,df1[order(animal,feed,-age),])

(5) 데이터 일부분을 선택해봅시다.

① 인덱싱을 이용한 방법입니다.

#1. 변수 MPG.highway 가 30보다 큰 값을 갖는 Model을 구해봅시다.
with(Cars93,Cars93[MPG.highway>30,"Model"])

# 2. 변수 Cylinders가 4이고 Type이 Small인 자동차의 Model과 Min.Price, Max.Price의 값을 출력
attach(Cars93)
my_vars<-c("Type","Min.Price","Max.Price")
my_case<-Cylinders==4&Type=="Small"
Cars93[my_cars,my_vars]

② 함수 subset()를 이용한 방법 입니다.

subset(data, select, subset) 이고 이때, select는 선택 혹은 제거될 변수를 지정하는 것이고 subset은 케이스를 선택하기 위한 조건을 지정하는 것입니다.

#1.변수 MPG.highway 가 30보다 큰 값을 갖는 Model을 구해봅시다.
subset(Cars93,select="Model",subset=(MPG.highway>30))

# 2.변수 Cylinders가 4이고 Type이 Small인 자동차의 Model과 Min.Price, Max.Price의 값을 출력
subset(Cars93,select=c("Type","Min.Price","Max.Price"),subset=(Cylinders==4&Type=="Small"))

#순서를 위한 변수를 선택할 수 있습니다.
#그 방법은 c() 대신 콜론 연산자를 쓸 수 있다는 것입니다.
subset(Cars93,select=Model:MPG.highway,subset=(MPG.highway>30))

#특정 변수를 제외하려면 마이너스 부호를 붙이면 됩니다.
subset(Cars93,select=-(Model:Origin),subset=(MPG.highway>30))

벡터에서는 결측값을 없애주는 옵션이 옵션(ra.rm=TRUE)이 있었습니다.

그렇다면 데이터 프레임에서도 똑같이 쓸 수 있는지 한 번 예를 통해 보겠습니다.

is.na(airquality)
mean(airquality,na.rm=TRUE)

NA를 찾아주는 함수는 쓸 수 있지만 옵션 na.rm은 쓸 수 없다는 것을 알 수 있습니다.

데이터 프레임의 결측값을 그대로 두게 되면 연산이 불가한 경우가 많기 때문에 제거를 안 할 수 없습니다. 데이터 프레임에서 결측값을 제거하는 방법은 na.omit()라고 하는 함수입니다.

head(airquality)
head(na.omit(airquality))

직접 데이터를 na.omit()를 써서 제거하기 전과 제거한 후를 보신 분들이라면 아실꺼라 생각합니다.

이 함수의 단점은 결측값을 갖고 있는 행 전체를 삭제합니다. 그렇다보니 많은 정보의 손실이 발생하게 됩니다.

그렇다면 dim()함수를 써서 행의 개수를 알아봅시다. 

dim(airquality)
dim(na.omit(airquality))

직접 데이터를 봐서도 알수 있었지만 이 dim()함수를 통해서도 줄어들었다는 것을 알 수 있었을 꺼라 생각듭니다.

(6) 데이터에서 임의표본 추출해봅시다.

데이터 일부분을 임의 추출하여 사용하고 싶을 때 sample()라는 함수를 씁니다.

이 함수를 다루기 전, 복원추출과 비복원 추출에 대해 알아야 합니다.

복원추출이란, 추출한 것을 다시 넣고(복원하고) 추출한 것을 말하고

비복원추출이란, 추출한 것을 다시 넣지 않고(비복원하고) 추출한 것을 말합니다.

이제 함수가 벡터에서 쓰인 예를 보겠습니다.

sample(1:6,size=3) #비복원추출
sample(1:6,size=3,replace=TRUE) #복원추출

예를 여러번 실행보신 분들이라면 이제는 그 의미가 더 와닿을 꺼라 생각합니다.

이번엔 데이터에서 쓰인 예를 살펴보겠습니다.

sample_x<-sample(1:nrow(Cars93),3)
Cars93[sample_x,]

(7) 데이터 프레임을 결합하고 싶을 때

DataFrame의 행 수가 같고, 행이 동일한 대상에 관한 것일 경우에는 cbind(데이터1,데이터2)를 쓰고

DataFrame의 열 수가 같은 경우에는 rbind(데이터1,데이터2)를 쓰고

각 DataFrame에 기준 열이 있는 경우에는 merge(데이터1,데이터2,by='정렬기준')를 쓰면 됩니다.

 

 

이전 발행 글

2021.06.03 - [개인공부공간/R] - R-벡터,행렬

2021.06.02 - [개인공부공간/R] - R-데이터 유형과 객체 간략히 살펴보기

728x90
반응형

'개인공부공간 > R' 카테고리의 다른 글

R-벡터,행렬  (6) 2021.06.03
R-데이터 유형과 객체 간략히 살펴보기  (16) 2021.06.02
Comments