R) 데이터프레임 - 생성

R) 데이터프레임 - 생성

데이터프레임은 1차원 벡터와 함께 데이터 핸들링에 가장 많이 쓰이는 객체 중 하나이다. 먼저 데이터프레임의 생성에 대해 알아보자.

데이터프레임(dataframe)은 list 객체의 특수한 형태(각 열의 원소 개수가 동일)로 테이블 형태의 데이터를 다룰 때 꼭 필요한 객체이자 자료구조이다.

다음의 데이터프레임 구조 예시를 보자.
데이터프레임 구조 예시

윗 부분의 납작한 주황색 네모 부분은 변수명 또는 열이름(column name)으로 함수 또는 인자에서 “colname”, “col.name”, “colnames” 라는 명칭으로 접근 또는 조작을 할 수 있다. 그리고 왼쪽의 얇은 주황색 네모 부분은 인덱스 또는 행이름(row name)이라고 부르며 함수 또는 인자에서 “rowname”, “row.name”, “rownames” 라는 명칭으로 접근 또는 조작을 할 수 있다.

각 열마다 색상이 다른 이유도 있는데 1차원 벡터와 행렬(matrix) 객체의 경우 문자나 숫자 같은 한 종류의 속성만 가능하지만 데이터프레임은 각 열마다 다른 데이터 속성을 지정할 수 있다. 예를 들어 첫 번째 열에는 이름(문자), 두 번째 열에는 나이(숫자), 세 번째 열에는 시험 점수(순서형) 등 서로 다른 속성이 한 객체안에 있을 수 있다. 하지만 하나의 열에 서로 다른 속성의 혼재는 불가하다. 앞에서 데이터프레임이 list 객체의 특수한 형태라고 했지만 조금 더 쉽게 이해하려면 원소 개수가 같은 1차원 벡터를 이어놓은 것이라고 생각하면 왜 하나의 열에 서로 다른 속성의 혼재가 불가한지, 각 열의 데이터 속성이 달라도 괜찮은지 이해하기 수월할 것이라고 생각된다.

이제 data.frame() 함수를 사용하여 데이터프레임 생성 코드를 작성해보자.

1
2
3
4
5
6
data.frame(v1 = c(1, 2, 3),
v2 = c(3, 4, 6))
## v1 v2
## 1 1 3
## 2 2 4
## 3 3 6

행렬의 조작 에서 행렬 생성시 다뤘던 “dimnames” 인자가 별도로 없고 이렇게 직접 “v1”과 “v2”는 변수명(column name)으로 지정되고 해당 변수에 1차원 벡터를 활용하여 원소를 할당하는 방식으로 데이터프레임을 생성할 수 있다. 오른쪽의 1, 2, 3은 행이름으로 향후 rownames() 함수로 접근하고 변경할 수 있다. 직접 행이름을 지정하여 생성하는 경우는 거의 없지만 만약 그렇게 하고자 한다면 다음과 같은 코드를 사용할 수 있다.

1
2
3
4
5
6
7
data.frame(v1 = c(1, 2, 3),
v2 = c(3, 4, 6),
row.names = c("A", "B", "C"))
## v1 v2
## A 1 3
## B 2 4
## C 3 6

다음의 코드는 변수명을 문자열로 입력하여 만드는 방법이다.

1
2
3
4
5
6
data.frame("v1" = c(1, 2, 3),
"v2" = c(3, 4, 6))
## v1 v2
## 1 1 3
## 2 2 4
## 3 3 6

상기 코드는 처음 소개한 코드에서 따옴표가 추가된 상태이기 때문에 보통 잘 사용하지 않지만, 데이터프레임을 자동으로 생성하려고 할 때 변수명을 어디선가 가져오는 형태로 코드를 작성하는 경우 용이하다.

변수명을 지정하지 않고 데이터프레임을 만드는 경우 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
data.frame(1:4) # 1
## X1.4
## 1 1
## 2 2
## 3 3
## 4 4

data.frame(matrix(1:4, ncol = 2)) # 2
## X1 X2
## 1 1 3
## 2 2 4

data.frame(matrix(1:4, ncol = 2),
aa = c("a", "b")) # 3
## X1 X2 aa
## 1 1 3 a
## 2 2 4 b

1번 코드의 경우 변수명이 “X1.4”로 되어있는데 R은 기본적으로 객체명과 변수명이 숫자로 시작하는 것을 허용하지 않기 때문에 앞에 “X”가 붙었고 특수문자도 제한적으로 허용하기 때문에 콜론(:)은 온점(.)으로 대체되었기 때문이다. 이와 비슷하게 2번 코드 또한 본래 변수명이 1과 2가 되어야 하나 숫자로 시작하기 때문에 영문 대문자 X가 붙어 “X1”과 “X2”로 표기되었다.

3번 코드의 경우 행렬과 1차원 벡터를 같이 사용하였다. 이 방법은 딱히 권장되진 않으나 일단 정상 동작하는 것을 볼 수 있고, 만약 이러한 동작을 처리하려면 되도록이면 cbind() 함수를 사용하여 먼저 matrix 객체를 만든 후 추가로 “aa” 변수를 추가하는 작업을 하는 것을 권장한다. 예를 들자면 다음과 같다.

1
2
3
4
5
df_mat = data.frame(matrix(1:4, ncol = 2))
cbind(df_mat, aa = c("a", "b"))
## X1 X2 aa
## 1 1 3 a
## 2 2 4 b

다음의 코드는 에러가 발생하는 코드로 각 열에 할당되는 원소의 개수가 같지 않으면 볼 수 있는 에러이다.

1
2
data.frame(v1 = c(1, 2, 3),
v2 = c(3, 4))

data.frame(v1 = c(1, 2, 3), v2 = c(3, 4))에서 다음과 같은 에러가 발생했습니다:
arguments imply differing number of rows: 3, 2

하지만 특수한 경우에는 원소의 개수가 다르더라도 에러 없이 정상적으로 데이터프레임을 생성할 수 있다.

1
2
3
4
5
6
data.frame(v1 = c(1, 2, 3),
v2 = "a")
## v1 v2
## 1 1 a
## 2 2 a
## 3 3 a

이는 벡터 리사이클링(vector recycling) 때문인데 관련해서 R) 벡터 리사이클링 포스팅에서 다루고 있으니 참고하면 된다.

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×