본문 바로가기
Programming/R

[R 기초] 데이터 객체 생성 및 처리 관련 구문

by Kanii 2022. 3. 25.
반응형

이번 포스팅에서는 '데이터 객체 생성 및 처리 관련 구문'에 대한 R 기초 문법을 살펴보겠다.

- 동일한 주제에 대한 SAS,Python 포스팅을 보고싶으시다면 아래 링크를 참고해주세요-

 

* 사용 환경

필자는 R 프로그래밍을 위해 R studio(R version 4.0.2)를 사용하고있다.

 

참고로, R version 4.0.x에서 특정 패키지들을 사용하기 위해선 R tools 40 설치가 필수적인데, 필자는 처음에 설치를 제대로 하지 못해서 많이 애를 먹었다..ㅠㅠ

혹시 나와같은 실패를 겪고있을 분들을 위해, 필자가 참고했던 좋은 영상 링크를 걸어둘테니 필요하신 분들은 꼭 참고해 보시길!

 

https://youtu.be/F5LYjvLxNJw

 

1. 워킹 디렉토리 설정(Working Directory)

 

 R에서 수행하는 모든 작업은 워킹 디렉토리에서 이루어지며, 해당 디렉토리에 .Rhistory 파일 역시 생성되어, 코드와 객체들을 모두 저장해 두지 않고 끄게 되더라도, 해당 디렉토리에서 다시 Rstudio를 실행하면 자동으로 복원이 이루어진다.

 

기본 워킹 디렉토리는 getwd(), 워킹 디렉토리 설정은 setwd('경로')를 통해 수행할 수 있다.

# 현재 워킹 디렉토리 확인
> getwd()

[1] "C:/Users/~~"
# 워킹 디렉토리 설정
>setwd('경로')

2. 데이터 객체 종류와 생성

 

SAS에서는 데이터를 생성하는 방법이 DATA 라이브러리.데이터명으로 고정되어있었지만, R은 데이터의 객체에 따라 생성하는 명령어가 다르다.

 

데이터 객체 (Data Object) 명령어
 Scalar  $x$ = 1
 Vector  $x$ = c( )
 Factor  $x$ = factor( )
 Matrix  $x$ = matrix(values, nrow= 행 수, ncol= 열 수 , byrow = T )
 Array  $x$ = array(values, dim = (first, second, third))
 Data Frame  $x$ = data.frame(variable = values, StringsAsFactors = F)
 List  $x$ = list(values)

 

모든 데이터 객체들에는 데이터의 타입을 나타내는 mode()와 원소의 개수를 나타내는 length()를 적용이 가능하며,

Matrix, Array, Data Frame, List 처럼 2차원 이상의 데이터 객체에 대해서는 dim() 함수를 통해 차원의 크기를 확인 할 수 있다.

 

데이터의 타입은 크게 4가지가 있다. : numeric / logical(참,거짓) / character(문자열) / complex(복소수)

 

여기서 눈여겨 볼 것은 Data Frame와 list를 제외한 모든 데이터 객체들은 여러개의 데이터 타입을 갖을 수 없다는 것이다.

 

예를 들어 살펴보자.

 > num=c(1,2);mode(num)
 [1] "numeric"

 > chr=c("Kanii","카니");mode(chr)
 [1] "character"

+ 아 참고로, R은 줄 바꿈만으로도 코드를 구분할 수 있지만, 한 줄에 여러 코드를 넣어서 한번에 실행하고 싶을 경우에만 세미콜론(;)으로 구분해주면된다.

 

num과 chr라는 벡터를 각각 생성하였다. 두 벡터는 각각 데이터 타입이 numeric, character인데, 이 두 벡터를 합쳐서 하나의 벡터 V를 만들 경우, num의 데이터 타입이 character로 바뀌게 된다.

 > V=c(num,chr);mode(chr)
 [1] "character"

 > print(V)
 [1] "1"     "2"     "Kanii" "카니" 

 

하지만, num과 chr을 각각 변수로 갖는 데이터프레임 df를 생성할 경우, 각각의 데이터 타입이 유지되는 것을 확인 할 수 있다.

 > df = data.frame("V1"=num,
 +                      "V2"=chr)
 
 > str(df) # str() : Any R object들의 structure를 보여주는 명령어
 'data.frame': 2 obs. of  2 variables:
  $ V1: num  1 2
  $ V2: chr  "Kanii" "카니"

 

각 데이터 객체들을 생성하는 명령어에는 여러 옵션들이 포함되어있는데, 자세한 옵션 목록은 R script 창에 '?'와 함께 명령어를 입력하면 확인 할 수 있다.

 > ?data.frame


3. 데이터 불러오기

 

R studio에서는 외부 데이터를 불러오는 방법이 두 가지있다.

 

첫 번째는 Environment 탭을 이용하는 것이다.

R studio > Environment > Import Dataset을 클릭하면 데이터 확장자에 따라 자동으로 데이터를 불러와주는 마법사를 실행할 수 있으며, 목록을 보면 SPSS,SAS,Stata 데이터 형식까지 불러올 수 있는 것을 확인 할 수 있다.

 

두 번째 방법은 read.table() 함수를 이용하는 것이다.

read.table('경로/데이터명.확장자명', header=T, sep = '구분자' ,StringsAsFactor=F)
# 경로는 \\ 혹은 백슬래시'/'로 해야한다.
# header=T or F , 불러올 데이터가 변수 명을 첫줄에 포함하고 있는 경우, header=T로 설정하면
# 알아서 변수명을 읽어들인다.
# sep='' , 구분자를 입력한다. csv 파일의 경우 구분자가 ','이다.

# StringsAsFactor = T or F, T로 설정하게되면 데이터에 포함된 문자형 변수를 Factor로 읽어들인다.

위 코드를 사용하여, 아래의 데이터를 읽어들여보자.

> DF = read.table("TEST2.txt",header=T,sep="") #이 데이터는 구분자가 스페이스이므로, seq=""로 설정해준다.
> DF
  Name Sex Major Age Score
1  KCS   M  Stat  25    50
2  KMH   M  Stat  20    88
3  CBH   M  Math  28    65
4  LYH   F  Math  19    90
5  BJS   F  Econ  21   100

4. 데이터 인덱싱(Indexing), 선택하기

 

R은 데이터 인덱싱 방법만 알고있으면, 변수 이름 설정, 제거 등 대부분의 데이터 처리를 쉽게 수행할 수 있다.

 

기본적으로 R의 인덱싱은 대괄호 []를 통해 이루어지며, 차원 구분은 ','를 사용한다.

# Vector : 1-dimension
vector[c] # c번째 원소 추출

# Matrix, Data Frame : 2-dimension
Matrix[r,c] # r-행 c-열 원소 추출
Matrix[r,] # r-행 추출
Matrix[,c] # c-행 추출

# Array : 3-dimension
Array[n,r,c]

# List
List[[c]] # 리스트 c번째 인자 추출
List[[c]][~,~] # 리스트의 c번째 인자의 원소 추출

추가로, 2-dimension 이상의 데이터 객체들에서 열이나 List의 인자에 이름이 설정되어있다면, '$'를 사용해서도 인덱싱이 가능하다.

 

예로 살펴보자.

 > DF[,1] # DF의 첫 번째 열 출력 -> 벡터의 형태로 반환해줌
 [1] "KCS" "KMH" "CBH" "LYH" "BJS"
 > DF$Name # DF의 첫 번째 열을 열 이름으로 선택
 [1] "KCS" "KMH" "CBH" "LYH" "BJS" 
 > DF[1,1] 
 [1] "KCS"

 > ls=list(num,chr) #List 생성
 > ls
 [[1]]
 [1] 1 2

 [[2]]
 [1] "Kanii" "카니" 

 > ls[[1]] # List의 첫 번째 인자 선택
 [1] 1 2
 > ls[[2]][1] # List의 두 번째 인자의 첫 번째 원소
 [1] "Kanii"
 > names(ls)=c("num","chr") # List 인자에 이름을 부여.
 > ls$num # List를 이름으로 인덱싱
 [1] 1 2

 

추가로, 여러 원소를 한꺼번에 선택하고 싶을 경우 원하는 인덱스 넘버를 벡터로 묶어서 선택하거나, 연속된 인덱스를 추출하고 싶은 경우 3:5 이런식으로 콜론을 사용할 수도 있다.

 

 > DF[,c(1,5)]
   Name Score
 1  KCS    50
 2  KMH    88
 3  CBH    65
 4  LYH    90
 5  BJS   100

 > DF[,1:3]
   Name Sex Major
 1  KCS   M  Stat
 2  KMH   M  Stat
 3  CBH   M  Math
 4  LYH   F  Math
 5  BJS   F  Econ

5. 변수 이름 바꾸기

 

R에서는 모든 데이터 객체에 대해 변수 이름 설정이 가능하다. (Scalar도 가능)

기본적으로 모든 데이터 객체들의 변수 이름을 names(객체) 함수를 통해 조작이 가능하다.

 

위에서 불러온 데이터 프레임 DF는 5개의 열을 가지고 있고, 이미 변수 명이 지정되어있다. 

names() 함수를 통해 확인해보자.

 

 > names(DF)
 [1] "Name"  "Sex"   "Major" "Age"   "Score"

 

데이터 프레임 DF의 변수명이 벡터의 형태로 출력되는 것을 알 수 있다.

여기서 벡터인 names(DF) 인덱싱을 통해 변수명을 바꿀 수 있다.

 

그러면, "Sex"를 "Gender"로 바꿔보자.

 

> names(DF)[2] # 벡터 인덱싱 적용 가능
[1] "Sex"

> names(DF)[2]="Gender"
> DF
  Name Gender Major Age Score
1  KCS      M  Stat  25    50
2  KMH      M  Stat  20    88
3  CBH      M  Math  28    65
4  LYH      F  Math  19    90
5  BJS      F  Econ  21   100

 

데이터 프레임 DF에서 두 번째 열의 변수명이 Sex에서 Gender로 바뀐 것을 확인 할 수 있다.


6. 변수 유지/ 제거

 

변수 유지(선택)은 위에서 인덱싱 한 것과 동일한 방법으로 수행할 수 있으며, 변수 제거는 제거하고 싶은 변수의 인덱스 번호에 (-)를 붙히면된다.

 

 > keep.df=DF[,1:3]
 > keep.df
   Name Gender Major
 1  KCS      M  Stat
 2  KMH      M  Stat
 3  CBH      M  Math
 4  LYH      F  Math
 5  BJS      F  Econ

 > delete.df=DF[,-c(4,5)]
 > delete.df
   Name Gender Major
 1  KCS      M  Stat
 2  KMH      M  Stat
 3  CBH      M  Math
 4  LYH      F  Math
 5  BJS      F  Econ

 

인덱싱을 활용한 선택,제거 방법은 당연히 에도 적용이 가능하다.

 

 > rowkeep=DF[1:3,]
 > rowkeep
   Name Gender Major Age Score
 1  KCS      M  Stat  25    50
 2  KMH      M  Stat  20    88
 3  CBH      M  Math  28    65

 > rowdelete=DF[-c(4,5),]
 > rowdelete
   Name Gender Major Age Score
 1  KCS      M  Stat  25    50
 2  KMH      M  Stat  20    88
 3  CBH      M  Math  28    65

 

변수 명을 활용해서 유지/제거를 하게 될 경우, 유지는 벡터 c()로 묶어서 숫자를 통한 선택과 동일하게 하면 되지만,

제거 같은 경우는 -c(변수명)으로는 시행되지 않는다. 열 이름을 통해 제거를 진행하고 싶다면, subset() 함수를 사용하여 원하는 변수를 추출하는 형태로 진행해야한다.

 

 > subset(DF,select=c("Name","Gender","Major"))
   Name Gender Major
 1  KCS      M  Stat
 2  KMH      M  Stat
 3  CBH      M  Math
 4  LYH      F  Math
 5  BJS      F  Econ

subset 함수같은 경우는 일정 조건에 따라 데이터를 슬라이싱할 수 있게 해주는 함수이다. (후에 조건문/반복문 파트에서 용법을 다시 설명하게 될 것 같다.)


이번 포스팅에서는 R에서 데이터 객체를 생성/조작하는 간단한 구문을 알아보았고,

다음번에는 조건/반복문에 대해서 살펴보겠다.


> SAS 버전

2022.03.23 - [Programming/SAS] - [SAS 기초] 데이터 생성과 처리 관련 구문

 

[SAS 기초] 데이터 생성과 처리 관련 구문

이번 포스팅에서는 SAS 기초 문법을 살펴보겠다. - 앞으로는 동일한 주제에 대해서 SAS, R, Python 버전으로 모두 포스팅 하려고 합니다. 3가지 버전으로 모두 포스팅이 완료되는대로 글 마지막에 링

harang3418.tistory.com

> Python 버전

2022.04.14 - [Programming/Python] - [Python 기초] 데이터 객체 생성 및 처리 관련 구문

 

[Python 기초] 데이터 객체 생성 및 처리 관련 구문

이번 포스팅에서는 데이터 생성 및 처리에 관련한 Python 기초 구문들을 살펴보겠다. * 사용 환경 필자는 Python 프로그래밍을 위해 Jupyter notebook을 사용하고있다. (주변에 파이썬을 자주 사용하시는

harang3418.tistory.com

 

반응형

'Programming > R' 카테고리의 다른 글

[R - 시계열] 단절 시계열 분석  (0) 2023.03.20
[Preprocessing] Quantile Normalization  (0) 2022.05.16

댓글