단순 데이터 형식
R 에서 데이터 형식은 크게 숫자, 문자, 논리로 나뉜다.
데이터 형식 | 예시 | |
숫자 | numeric | 정수, 실수 1, 2, 3, -1, 1.45, -24.8 |
문자 | character | 문자나 문자열 (따옴표로 감싸짐) "korea", "10", "안녕" |
논리 | logical | 참과 거짓 TRUE, FALSE (T, F도 사용 가능) |
특수한 경우 | NULL | 정의되어 있지 않은 값 자료형도 없고 길이도 0 |
NA | 결측값 | |
NaN | 정의가 불가능한 값 sqrt(-5) |
|
Inf, -Inf | 양의 무한대와 음의 무한대 |
우선순위가 있는데 특수한 경우를 제외하면 문자형 > 숫자형 > 논리형 순이다. 이는 벡터를 다룰 때 중요하다.
변수
데이터들은 이러한 단순 데이터 형식을 포함하여 다양한 데이터 형식을 이용해 변수에 저장할 수 있다.
대입연산자인 <- 혹은 = 을 이용하여 변수를 생성하고 값을 대입할 수 있는데, 예를 들어 x 라는 변수에 5 를 대입하고 싶다면 다음과 같은 코드를 이용하면 된다.
x <- 5
변수의 이름은 영어나 마침표로 시작해야 하고, 영문자, 숫자, 마침표, 밑줄을 사용할 수 있다. 단 마침표로 시작하는 변수명은 R 스튜디오에서 정상적으로 인식하지 못하는 문제가 있다.
다른 프로그래밍 언어와 다르게 이미 있는 키워드도 변수로 사용할 수 있어서 주의가 필요하다. 예를 들어 다음과 같은 코드가 있다고 해보자.
print <- 5
print 는 출력을 위한 함수인데, 여기서 5 를 대입해버리니 이후로는 print 를 사용할 수 없게 된다. 보통 프로그래밍 언어에서는 키워드를 변수 이름으로 사용하지 못하게 막는 것과 반대된다. 자율성이 생긴 것이지만, 실수할 수 있는 경우도 늘어난 것이기에 특히 주의가 필요하다.
또한 C 언어 등 몇몇 언어에서는 변수의 자료형을 명시해야 되지만, R 은 자료형을 명시하지 않고 선언 및 사용하기 때문에 이 부분에서도 실수가 있을 수 있다.
class 함수와 typeof 함수를 이용해서 자료형을 확인할 수 있다.
요인 (Factor)
범주형 자료를 저장하는 데에 이용되는 자료형이다. 요인이 아니라 영어 발음대로 팩터라 하기도 한다.
다음과 같이 요인 변수를 초기화할 수 있다. 이때 data 는 벡터 형식이어야 한다.
factor_name <- factor(data)
요인은 저장되는 값의 종류가 정해진다면 수정이 불가능하기 때문에 데이터를 다룰 때 상대적으로 안전하다.
요인을 저장할 때는 매개변수 levels 와 ordered 를 이용하여 순서형 요인으로 만들 수 있다. ordered_data 는 순서를 나타내는 데이터로 역시 벡터 형식이어야 한다.
factor_name <- factor(data, levels=ordered_data, ordered=TRUE)
levels 함수를 이용하여 요인의 저장된 값들의 종류를 알 수 있고, integer 함수를 이용해 순서대로 숫자로 바꾸어서 출력도 가능하다.
각 요인의 값 자체는 변경할 수 있지만, 앞서 말한바와 같이 종류는 변경할 수 없기 때문에 다른 종류의 값을 요인의 값에 대입하려하면 오류가 발생한다.
벡터 (Vector)
벡터는 동일 형식 데이터의 나열이다. 다른 언어에서의 배열과 비슷하다.
다음과 같이 벡터 변수를 초기화할 수 있다.
vactor_name <- c(data)
만약 다른 데이터 형식을 벡터에 넣는다면 우선순위에 따라 데이터 형식이 바뀐다. 예를 들어 문자형 데이터와 숫자형 데이터를 같은 벡터 변수에 넣게 된다면, 모든 데이터가 문자형 데이터가 된다. 또 숫자형 데이터와 논리형 데이터를 같은 벡터 변수에 넣게 되면 모든 데이터가 숫자형 데이터가 되며 TRUE 는 1 로 FALSE 는 0 으로 치환된다.
기본적으로 벡터의 원소값에는 이름이 없지만, names 함수를 이용해서 이름을 추가해줄 수 있다.
names(vactor_name) <- names_vactor
names_vactor 역시 벡터여야 하며 순서대로 원소의 이름이 된다. 단 원소의 길이보다 길면 안된다. 원소의 길이보다 짧다면 부족하여 이름이 없는 원소는 이름으로 결측값인 NA 를 가지게 된다.
기본적인 산술연산을 하면 벡터 내의 모든 값에 영향을 주는 방식으로 계산된다. 예를 들어 벡터의 원소가 (1, 2, 3) 일 때 벡터에 3 을 곱하면 원소라 (3, 6, 9) 인 벡터가 반환되는 것이다.
벡터가 정렬 가능하다면 sort 함수를 이용해서 정렬도 가능하다.
sort(vactor_name) # 벡터의 오름차순 정렬
sort(vactor_name, decreasing=TURE) # 벡터의 내림차순 정렬
벡터를 이용할 때 차원 속성을 추가하여 행렬과 배열 비슷하게 만들 순 있지만, 엄연히 다른 자료형이니 주의가 필요하다.
행렬 (Matrix)
동일 형식의 2차원 데이터이다.
다음과 같이 행렬 변수를 초기화할 수 있다. data 는 벡터 형식이어야 하고, num_row 는 행의 수, num_col 은 열의 수이다.
matrix_name <- matrix(data, nrow=num_row, ncol=num_col)
벡터 데이터를 행과 열의 수에 맞추어 첫번째 열부터 차례대로 채워나가 행렬을 만든다. 만약 데이터가 부족하면 처음부터 데이터를 다시 반복한다. 열부터 채워나가지 않고, 행부터 채워나가고 싶다면 매개변수 byrow 를 이용하면 된다.
matrix_name <- matrix(data, nrow=num_row, ncol=num_col, byrow=TRUE)
벡터와 마찬가지로 다른 형식의 데이터를 넣으면 상위 형식으로 모든 데이터가 변환경된다.
cbind 혹은 rbind 를 이용해여 벡터를 묶어서, 혹은 행렬에 벡터를 추가하여, 혹은 행렬끼리 묶어서 새로운 행렬을 만들 수 있다. cbind 는 열(column)을 중심으로, rbind 는 행(row)을 중심으로 묶는다.
이때 벡터의 길이가 다른 경우 길이가 부족한 벡터를 반복하여 길이를 채운다. 하지만 행렬이 대상이 되어 결합할 때, 즉 벡터와 행렬의 결합이나 행렬과 행렬의 결합에서는 행이나 열의 수가 일치해야 한다.
벡터와 마찬가지로 이름을 붙일 수 있고, 이때 행의 이름은 rownames , 열의 이름은 colnames 함수를 사용한다.
보통은 행과 열로 많이 부르지만, 행을 레코드, 열을 필드라고도 한다.
배열 (Array)
행렬이 2차원 데이터였다면, n차원 데이터에 대해서는 배열을 이용할 수 있다.
array_name <- array(data, dim=c(num_row, num_col, first_depth, second_depth ...))
행렬과 마찬가지로 행, 열, 차원 깊이에 맞춰서 데이터를 채워넣는다.
역시 같은 데이터 형식으로 이뤄져 있기에 다른 형식의 데이터를 넣으면 상위 형식으로 모든 데이터가 변환된다.
데이터 프레임 (Data Frame)
다양한 형식의 데이터를 2차원 데이터 테이블 형태로 묶는 자료형이다.
다음과 같이 데이터 프레임 변수를 초기화할 수 있다. 일반적으로 여러개의 벡터가 매개변수로 사용된다.
dataframe_name <- data.frame(first_vector, second_vector, ...)
만약 벡터 중 길이가 부족한 벡터가 있다면 행렬과 배열 만들 때와 동일하게 순환을 통해 길이를 맞춘다.
리스트 (List)
정말 어떤 자료형이던 넣을 수 있는 자료형이다. 예를 들어 데이터 프레임은 데이터 프레임을 저장하지 못하지만, 리스트는 데이터 프레임을 저장할 수 있고, 리스트 속 리스트 역시 가능하다.
다음과 같이 리스트 변수를 초기화할 수 있다.
list_name <- list(first_name=data1, second_name=data2, ...)
이름과 함께 데이터를 리스트에 저장할 수 있고, $ 연산자를 통해 접근할 수 있다. 예를 들어 name 이라는 리스트에 원소로 (90, 50, 70) 가 있고 이 원소의 이름이 john 이라 하면 다음과 같이 접근하여 john 의 데이터를 확인할 수 있다.
print(name$john)
인덱싱
- 기본적인 인덱싱
단일 데이터를 가지는 변수가 아니라면 변수가 가지는 각 값에 접근하기 위해 인덱싱이 필요하다. 대괄호 [] 를 이용하여 접근하며, 대부분 프로그래밍 언어와 다르게 1 부터 시작한다.
var_name[index]
1차원 데이터에서는 위와 같이 index 번째의 데이터에 접근할 수 있다. 즉 벡터, 리스트에서 이용할 수 있다.
이때 index 값이 음수라면 즉 index 가 - i 라 가정하면 i 번째 데이터를 제외한 나머지 데이터라는 의미이다.
만약 행렬과 같이 2차원 데이터인 경우에는 다음과 같은 인덱싱이 필요하다.
var_name[row, col]
row 행, col 열에 해당하는 데이터를 추출한다.
- 벡터를 이용한 인덱싱
벡터를 이용해서 인덱싱할 수도 있는데, 예를 들어서 1, 2, 3 번째 원소를 추출하고자 한다면 다음과 같이 나타낼 수도 있다.
idx <- c(1, 2, 3)
var_name[idx]
먼저 idx 에 (1, 2, 3) 벡터가 대입되고, 이를 통해서 인덱싱하면 해당하는 원소만 추출된다. 이때 - 를 붙여서 idx 에 대입하면 해당 하는 원소만 제외하고 추출된다.
c 함수를 통해서 벡터를 만들지 않아도, : , seq, rep 등을 이용해서 간단히 벡터를 생성하고, 이용할 수 있다.
- a : b
파이썬의 range 함수와 비슷하게 작동한다. a 부터 b 까지의 벡터를 반환한다.
예를 들어 아래와 같이 var 에 1 : 5 를 대입한다 가정하자.
var <- 1:5
그렇다면 var 는 (1, 2, 3, 4, 5) 벡터가 된다.
- seq()
간격을 1 이 아닌 다른 수로 조절하고 싶다면 seq 함수를 이용하면 된다. 기본 동작 자체는 a : b 를 사용하는 것과 유사하다.
예를 들어 다음과 같이 1 부터 10 까지 수 중 짝수만 var 변수에 대입할 수 있다.
var <- seq(1, 10, 2)
- rep()
특정 수를 반복하고 싶다면 rep 함수를 이용하면 된다.
예를 들어 숫자 10 을 15 번 반복하는 벡터를 만들고 싶다면, 즉 (10, 10, ... , 10) 을 만들고 싶다면 다음과 같은 코드를 이용하면 된다.
var <- rep(10, 15)
숫자가 아니라 벡터도 반복할 수 있는데, 예를 들어 1 에서 5 까지 수를 5 번 반복시킨 벡터를 만들고자 하면 다음과 같이 코드를 짤 수 있다.
var <- rep(1:5, 5)
반복의 반복도 가능한데, 예를 들어 1 부터 3 까지 수를 각각 2 번 반복한 것을 3 번 반복할 수도 있다.
var <- rep(1:2, times = 3, each = 2)
- 인덱싱에 활용
위와 같은 함수를 이용해서 인덱싱을 할 수 있다. 예를 들어 길이가 10 인 벡터에서 1 에서 5 까지 데이터만 추출하고 싶다면 다음과 같은 코드를 이용하면 된다.
var[1:5]
혹은 1 에서 5 까지 제외하고 싶다면 다음과 같은 코드를 사용할 수 있다.
var[-1:-5]
행렬에서도 역시 사용할 수 있다. 예를 들어 1 행에서 5 행까지, 그리고 2 열에서 4 열까지 데이터를 가져오고 싶다면 다음과 같은 코드를 이용할 수 있다.
matrix_name[1:5, 2:4]
- 이름을 이용한 인덱싱
만약 원소에 이름을 붙였다면 원소의 이름을 이용해서도 인덱싱이 가능하다.
var[element_name]
단 원소의 이름은 문자형이므로 " " 을 사용해야 한다.
벡터를 이용한 인덱싱을 참고하여 해당하는 원소 이름을 벡터로 저장한 후에 벡터로 인덱싱을 하여도 된다.
- 논리형 인덱싱
인덱스로 논리형을 사용할 수도 있다. 논리형이 TRUE 라면 추출하고, FALSE 라면 추출하지 않는 형태이다. 보통 벡터 형태로 논리형을 만들고 사용한다.
예를 들어 1 부터 5 까지 값이 순서대로 들어있는 벡터에서 3, 5 번째 값을 추출하려 하면 다음과 같이 코드를 구성할 수 있다.
idx <- c(F, F, T, F, T)
var[idx]
- 조건문을 통한 인덱싱
벡터에 조건문을 사용하면 조건에 따라 TRUE 나 FALSE 를 벡터 길이만큼 반환한다. 즉 각 벡터의 원소가 조건문을 만족하면 TRUE 를, 만족하지 않는다면 FALSE 를 반환하고 이를 벡터 형태로 반환하는 것이다.
예를 들어 다음 코드를 확인하자.
var <- c(10, 4, 8, 2, 3, 9)
var > 5
var > 5 에 따라서 차례대로 var 의 원소를 확인한다. 10 은 5 보다 크기에 T, 4 는 작기에 F, 반복하면 반환하는 벡터는 (T, F, T, F, F, T) 이다.
이를 다시 인덱싱에 활용할 수 있다.
예를 들어서 위 var 에서 5 이상인 값만 추출하려면 다음과 같은 코드로 추출할 수 있다.
var[var>5]
'Language > R' 카테고리의 다른 글
[R] 단일변수 탐색적 자료 분석(EDA) (0) | 2024.10.28 |
---|---|
[R] which 를 이용한 데이터 위치 확인 (0) | 2024.10.27 |
[R] for 와 while 을 통한 반복문 및 apply (0) | 2024.10.27 |
[R] 데이터 파일과 사용자 정의 함수 및 변수 불러오기 (0) | 2024.10.14 |
[R] 기본 연산자 우선순위 (0) | 2024.09.03 |