R #1. 기본 문법과 자료형
통계에 대해 공부하면서 R을 맛만 조금 봤다.
개발을 접해본 적은 있었기에 흐름을 따라가기에는 어렵지 않았지만
기본적인 문법이나 자료형에 대해 모르고 있었기 때문에 한계점을 느끼고 R이라는 언어의 기본적인 부분만 정리해보고자 한다.
출처는 R 공식문서이며,
An Introduction to R
R can generate graphics (of varying levels of quality) on almost any type of display or printing device. Before this can begin, however, R needs to be informed what type of device it is dealing with. This is done by starting a device driver. The purpose of
cran.r-project.org
다른 언어를 공부할 때와 같이
- 변수
- 자료형
- 함수
- 반복문
- 조건문
에 대해서 짚고 넘어가 보도록 하자.
R이란?
R이란 통계적 계산 및 그래픽을 위해 개발된 프로그래밍 언어이며, 인터프리터 언어이다.
다양한 패키지를 제공하며, 이는 CRAN(the Comprehensive R Archive Network)을 통해 받을 수 있다.
IDE로는 RStudio라는 소프트웨어를 사용하며, Rd(R documentation)이라는 자체 문서 형식을 사용한다.
Help
R의 다양한 기능, 함수들을 사용하다가 궁금한 것이 있으면, help 기능을 사용하면 편리하다.
help(solve)
?solve
특수문자의 경우
help("[[")
R 도움말 페이지를 켜거나 도움말 페이지에서 검색하고 싶은 경우
help.start()
??solve
예시를 보려면
example(topic)
Workspace
R에서 우리가 다루는 데이터나 변수들은 workspace에 저장되며, RStudio에서는 Environment 창에서 확인할 수 있다.
이 데이터들은 .RData 라는 파일에 저장되며
내가 사용했던 명령어들은 .RHistory 파일에 저장되어 추후 프로젝트를 다시 열 때 불러와진다.
Data type
- Numeric : 숫자로, 정수와 실수를 포함한다.
- Character : 문자형
- Factor : 팩터, 뒷부분에 다룬다.
- Logical : 논리형
Objects
R에서는 여러 객체를 다루게 되는데,
- Vectors
- Arrays & Metrices
- Factors
- Lists
- Data Frames
- Functions
가 있다.
Vector
할당 Assignment
R은 기본적으로 단일 데이터보다는 다수의 데이터를 다루는 통계에 집중하는 언어이기 때문에기본적으로 "벡터"라는 개념을 사용한다. 순서가 있는 여러 개의 데이터를 뜻한다.
어떠한 자료를 변수에 할당하는 것을 assignment라고 하며, 다양한 방법이 존재하는데 그 예시들은 다음과 같다.
x <- c(10.4, 5.6, 3.1, 6.4, 21.7)
assign("x", c(10.4, 5.6, 3.1, 6.4, 21.7))
c(10.4, 5.6, 3.1, 6.4, 21.7) -> x
벡터는 c()로 묶어서 사용하며, 이를 위와 같이 할당연산자나, 할당 함수를 이용하여 x라는 변수에 벡터를 할당할 수 있다.
1/x
y <- c(x, 0, x)
위와 같이 벡터 자체를 연산에 넣는 경우, 벡터의 모든 원소들에 연산이 동일하게 실행되며,
벡터를 다른 벡터에 끼워 넣을 수 있는데 이때 벡터의 차원은 변하지 않는다.
벡터의 산술계산
벡터끼리는 연산이 가능하다.
이 때 벡터의 길이가 서로 다르다면, 길이가 짧은 벡터의 값이 반복되어 연산에 사용된다.
x <- c(1, 2, 3)
y <- c(4, 5, 6, 7)
z <- 2 * x + y + 100
이와 같이 계산하면 z는 c(106, 109, 112, 109)가 된다.
이런 방식으로 여러 기본 연산들이 가능하다.
+, -, *, / 뿐 아니라 ^, log, exp, sin, cos, tan, sqrt 등등 모두 가능하다.
이외 직관적으로
min(x), max(x), mean(x), range(x)을 사용할 수 있고
sum(x)로 원소들의 합을
prod(x)로 원소들의 곱을 구할 수 있다.
시퀀스 Sequence
: (콜론) 연산자를 이용하여 벡터를 생성할 수 있다.
a <- 1:5
b <- 4:2
c <- seq(1, 2, by=0.3)
d <- seq(length=4, from=-3, by=0.2)
e <- rep(a, times=2)
f <- rep(a, each=3)
직관적으로 사용할 수 있다.
논리 벡터
논리 연산 또한 벡터로 사용할 수 있다.
logic <- 1 > 3
logic + 3
산술 연산을 할 경우 TRUE는 1, FALSE는 0으로 취급된다.
결측값
자료를 정리하고 통계를 돌리는 과정에서 결측치의 관리는 매우 중요하다.
R에서는 결측치가 NA(Not available)이라고 표시되며
0/0과 같이 계산할 수 없거나 Inf(무한대 값)과 같은 경우 NaN(Not a Number)라고 표시된다.
이를 확인하는 함수는
is.na()
in.nan()
이며, 벡터의 각 원소에 대해 na / nan인지를 확인하여
논리 연산자로 된 길이가 같은 벡터를 반환한다.
참고로 <NA> 같은 경우에는 결측치에 해당하는 값이 문자열인 경우이다.
문자 벡터
"Values"와 같이 " " 큰 따옴표 안에 사용한다. 기타 언어들의 문자열과는 조금 다른 특징이 있는데, 예를 들어 파이썬 등에서 x = "ABCDE"인 경우 길이가 5인 문자열로 인식하는 반면, R에서는 한 덩어리로 인식한다. 즉 문자열 자체의 인덱싱은 불가능하고, c("AB", "CDE")처럼 문자열 여러 개를 벡터로 묶을 수 있다.
관련 함수로는 paste() 함수가 있는데,
여러 arguments들을 하나로 묶어 문자 벡터로 만들어주는 기능을 한다.
이전의 벡터 연산에서 처럼 길이가 짧은 벡터의 원소들이 반복되는 것을 알 수 있다.
sep 옵션은 두 벡터를 연결하는 사이에 넣어주는 것을 뜻한다.
인덱스 벡터
R은 다양한 방식의 인덱싱을 파이썬과 비슷한 방식으로 제공한다.
원리는 마치 pandas의 series나 DataFrame에서 원소들을 골라낼 때, 인덱스 내에 mask or boolean series를 넣었던 것과 비슷하다. 크게 어렵지 않다.
Factor
팩터는 R에 있는 조금 특이한 객체이다.
다음의 예시를 통해 팩터가 뭔지 이해만 하고 넘어가자.
state <- c("tas", "sa", "qld", "nsw", "nsw", "nt", "wa", "wa",
"qld", "vic", "nsw", "vic", "qld", "qld", "sa", "tas",
"sa", "nt", "wa", "vic", "qld", "nsw", "nsw", "wa",
"sa", "act", "nsw", "vic", "vic", "act")
f_state <- factor(state)
8개의 종류로 이루어진 30개의 자료가 있다.
factor 함수로 이를 "팩터화"하여 f_state라는 팩터 오브젝트를 생성하면, f_state는 다음과 같다.
자동으로 종류를 분석하여 이를 Levels라고 따로 분류한다.
즉 기준이 되는 팩터의 종류가 Level이다. 이때 Level의 순서는 자동으로 알파벳순으로 나열되었기 때문에, sort 하게 되면 다음과 같이 나열된다.
만약 이 level의 순서를 바꾸고 싶다면 다음과 같이 하면 되겠다.
lvl_state <- c("nsw", "qld", "sa", "nt", "act", "vic", "wa", "tas")
f2_state <- factor(state, levels=lvl_state)
위와 같이 level의 순서가 변경된 것을 볼 수 있다.
Array & Matrices 배열과 행렬
Array
R에서 가장 기본이 되는 Vector는 1차원 배열만을 다루었다. 즉 인덱스가 단일 인덱스로만 표현이 가능하였다. 이를 확장한 것이 Array이다. 1차원 Array도 가능은 하지만, Vector와 혼동될 수 있으므로 지양한다.
Array에는 항상 dimension vector라는 것이 따라다니는데, 배열의 차원이 어떻게 되는지를 이야기한다.
arr1 <- array(1:24, dim=c(3, 2, 4))
(3, 2, 4) 차원을 갖고 1~24를 원소로 갖는 배열을 생성하였고, 모양은 다음과 같다.
디멘젼은 순서대로 행, 열, 층, ~~~ 이다.
dimnames 옵션을 이용하여 이름을 붙일 수 있다.
dimnames(arr1) <- list(
c("one", "two", "three"),
c("A", "B"),
c("uno", "dos", "tres", "cuatro")
)
# 혹은 배열 생성 시에 dimnames 옵션을 사용할 수도 있다.
arr1 <- array(1:24, dim=c(3, 2, 4), dimnames=list())
원소 추출은 직관적으로 하면 된다.
'-' minus 기호를 사용하는 방법과, 논리 연산도 가능하다고 알고 넘어가자.
행렬 연산도 가능하지만, 의학연구에서 쓸 일은 없을 것 같아서 넘어간다.
Matrix
Matrix는 2차원 array라고 생각하면 편하다.
다만 Array와 마찬가지로 원소들의 자료형이 동일해야 한다.
그러나, 우리가 연구할 때에는 column 별로 다른 자료형이 들어가기도 하는데, 이를 위해 필요한 것이 DataFrame이다.
Matrix, Dataframe은 기본적으로 array를 다루는 것에서 크게 벗어나지 않기 때문에 그때그때 찾아보면 된다.
자세히 다룰 필요도, 의미도(현재로서는) 없을 것 같다.
List
List 또한 여러 다른 형태의 객체를 함께 묶을 때 사용하는 객체 정도로 이해하자.
마치며
그나마 다행으로 기존에 다른 언어를 맛보아서 그런지 R의 기본적인 내용을 받아들이기는 수월하였다.
vector의 개념과, 다른 언어에서는 없는 Factor 정도만 잘 머릿속에 정리하고 넘어가면 될 것 같다.
- 1차원 : Vector
- 2차원 : Matrix
- 자료형이 상이한 2차원 : Data.frame
- 3차원 : Array
'Career > R' 카테고리의 다른 글
ggplot2 #4. practice - moonBook::acs (0) | 2023.01.03 |
---|---|
ggplot2 #3. Useful libraries - GGally, ggpubr, gganimate, esquisse, color packages (0) | 2023.01.02 |
ggplot2 #2. 추가 요소들 (0) | 2023.01.01 |
ggplot2 #1. 기본 문법 (0) | 2022.12.31 |
R #2. plot 함수, 기타 그래픽 함수 (0) | 2022.12.30 |