작성자: admin 작성일시: 2016-09-29 15:54:28 조회수: 248 다운로드: 31
카테고리: R 태그목록:

R 데이터프레임

데이터프레임(data frame) 자료형은 데이터 분석에서 가장 유용하며 필수불가결한 자료형이다. 데이터프레임은 표(table)형태의 데이터 또는 엑셀과 같은 분석 프로그램의 시트(sheet) 데이터를 구현하기 위한 자료형이라고 보면된다.

데이터프레임과 행렬의 차이

데이터프레임과 행렬은 모두 2차원 데이터이지만 다음과 같은 점이 다르다.

  • 데이터프레임의 각 열은 서로 다른 자료형이 될 수 있다.
  • 데이터프레임은 열 이름, 행 이름을 가질 수 있다.

데이터프레임 생성

데이터프레임 객체를 만들때는 data.frame 명령을 사용한다. 열 이름을 인수로 해서 열 데이터에 해당하는 벡터를 입력한다. 이 때 인수의 순서가 데이터프레임 열의 순서가 되므로 열의 순서에 맞추어 인수를 주어야 한다. 행 이름은 row.names라는 별도의 인수 이름으로 넣는다.

In [1]:
df <- data.frame(inflation=c(2.34, 2.74, 0.27, 2.31),
                 realgdp=c(2778, 2775, 2785, 2847),
                 unemp=c(5.1, 5.3, 5.6, 5.2),
                 recess=c("No", "No", "No", "No"),
                 row.names=c("1959/06", "1959/09", "1959/12", "1960/03"))
In [2]:
df
inflationrealgdpunemprecess
1959/062.3427785.1 No
1959/092.7427755.3 No
1959/120.2727855.6 No
1960/032.3128475.2 No

행렬은 모든 원소가 같은 자료형이어야 한다. 즉, 모두 정수이거나 모두 실수이거나 모두 문자열이어야 한다. 하지만 데이터프레임의 각 열은 서로 다른 자료형을 가질 수 있다. 즉, 위의 예에서 inflation, unemp 열은 실수 자료형이고 realgdp는 정수 자료형, 그리고 recess 열은 문자열 자료형으로 서로 다르다. 앞서 이야기 했듯이 이러한 자료는 행렬로 만들 수 없다.

또한 데이터프레임의 각 행과 열은 문자열로 된 이름을 가질 수 있다. 위의 예에서 열 이름은 각각 inflation, realgdp, unemp, recess이다. 행 이름은 "1959/06", "1959/09", "1959/12", "1960/03"이다. 이러한

만약 각 열의 데이터를 일단 변수에 넣고 그 변수를 열 데이터로 사용하는 경우에는 별도로 인수 이름을 주지 않아도 변수이름을 열 이름으로 사용한다.

In [3]:
inflation <- c(2.34, 2.74, 0.27, 2.31)
realgdp <- c(2778, 2775, 2785, 2847)
unemp <- c(5.1, 5.3, 5.6, 5.2)
recess <- c("No", "No", "No", "No")
df <- data.frame(inflation, realgdp, unemp, recess,
                 row.names=c("1959/06", "1959/09", "1959/12", "1960/03"))
In [4]:
df
inflationrealgdpunemprecess
1959/062.3427785.1 No
1959/092.7427755.3 No
1959/120.2727855.6 No
1960/032.3128475.2 No

행렬을 데이터프레임으로 변환

행렬을 데이터프레임으로 변환하는 것도 가능하다. 이 때 열이름을 지정해주지 않으면 "X"를 접미사로 하여 X1, X2, 이런 식으로 열 이름이 붙는다. 행 이름은 지정하지 않으면 별도로 생성되지 않으며 표시되지도 않는다.

In [5]:
m <- matrix(1:6, nrow=3)
df2 <- data.frame(m)
df2
X1X2
14
25
36
In [6]:
df3 <- data.frame(m, row.names=c("r1", "r2", "r3"))
df3
X1X2
r114
r225
r336

행/열 이름 변경

데이터프레임의 열 이름과 행 이름은 colnames, rownames 명령으로 읽거나 바꿀 수 있다.

In [7]:
colnames(df3)
  1. 'X1'
  2. 'X2'
In [8]:
colnames(df3) <- c("c1", "c2")
In [9]:
df3
c1c2
r114
r225
r336

데이터프레임 인덱싱

1. 하나의 열 전체를 인덱싱 (리스트 방식 인덱싱)

데이터프레임은 사실 data.frame 클래스 속성을 추가한 리스트 자료형이라고 볼 수 있다. 즉, 각 열의 데이터는 리스트의 원소이다. 따라서 열이름을 사용하여 다음과 같이 하나의 열 전체를 인덱싱 할 수 있다.

In [10]:
df$inflation
  1. 2.34
  2. 2.74
  3. 0.27
  4. 2.31
In [11]:
df[["inflation"]]
  1. 2.34
  2. 2.74
  3. 0.27
  4. 2.31

이 때는 서브세팅(subsetting)이 아닌 인덱싱이므로 결과가 데이터프레임이 아니라 벡터가 된다.

2. 하나의 원소를 인덱싱

하지만 리스트와 달리 데이터프레임에서는 행렬 방식의 comma(,)를 사용한 인덱싱도 할 수 있다. 이 때 다음 규칙을 지킨다.

  • single bracket [] 형태의 인덱싱을 사용한다.
  • 행 이름이 열 이름보다 먼저 온다.
  • 이름 대신 숫자 인덱스를 쓸 수도 있다.

즉, 가장 첫 행의 가장 첫 열 데이터는 다음과 같은 방법으로 인덱싱한다.

In [12]:
df["1959/06", "inflation"]
2.34
In [13]:
df["1959/06", 1]
2.34
In [14]:
df[1, "inflation"]
2.34
In [15]:
df[1, 1]
2.34

3. 하나의 행 또는 열 전체를 선택

행이나 열 전체를 선택하려면 comma를 유지한 채, 해당 위치의 인덱스를 생략하면 된다.

즉, 첫번째 행 전체를 선택하려면 다음과 같다.

In [16]:
df["1959/06", ]
inflationrealgdpunemprecess
1959/062.3427785.1 No

또는

In [17]:
df[1, ]
inflationrealgdpunemprecess
1959/062.3427785.1 No

또 첫번째 열 전체를 선택하면 다음과 같다. 이경우에는 데이터프레임 자료형이 아니라 벡터가 된다.

In [18]:
df[, "inflation"]
  1. 2.34
  2. 2.74
  3. 0.27
  4. 2.31

4. 일부분 선택

데이터프레임의 일부분만 선택하려면 single bracket 인덱싱을 사용하되 인덱스로 벡터를 쓴다.

In [19]:
df[2:3, c("inflation", "realgdp")]
inflationrealgdp
1959/092.742775
1959/120.272785

인덱스 벡터로는 TRUE, FALSE를 가지는 불리언 벡터를 사용할 수도 있다.

In [20]:
df[(realgdp < 2800) & (inflation > 2), ]
inflationrealgdpunemprecess
1959/062.3427785.1 No
1959/092.7427755.3 No

행/열의 추가

데이터프레임에 행이나 열을 추가하려면 rbind 명령이나 cbind 명령을 사용한다. 이 때 인수의 이름으로 행이나 열 이름을 지정할 수 있다.

In [21]:
df3 <- data.frame(matrix(1:6, nrow=3))
colnames(df3) <- c("c1", "c2")
rownames(df3) <- c("r1", "r2", "r3")
df3
c1c2
r114
r225
r336
In [22]:
rbind(df3, c(10,11))
c1c2
r1 1 4
r2 2 5
r3 3 6
41011
In [23]:
rbind(df3, r4=c(10,11))
c1c2
r1 1 4
r2 2 5
r3 3 6
r41011
In [24]:
df4 <- cbind(df3, c3=c("A", "B", "C"), c4=c("A1", "A2", "A3"))
df4
c1c2c3c4
r11 4 A A1
r22 5 B A2
r33 6 C A3

행/열의 삭제

열을 삭제하려면 해당 열을 서브셋팅하여 NULL을 할당한다.

In [25]:
df4[,"c1"] <- NULL
In [26]:
df4
c2c3c4
r14 A A1
r25 B A2
r36 C A3

하지만 이 방법은 행을 삭제하는데는 사용할 수 없으므로 행의 경우에는 음수 인덱스를 사용하여 삭제할 행을 제외한 나머지 값을 다시 변수에 할당하는 변칙적인 방법을 써야 한다.

In [27]:
df4 <- df4[-1,]
df4
c2c3c4
r25 B A2
r36 C A3

attach/detach

attach 명령을 사용하면 데이터프레임의 열 데이터가 분리되어 독립적인 벡터가 된다.

In [28]:
attach(df4)
In [29]:
c2
  1. 5
  2. 6

attach 상태를 취소하려면 detach 명령을 사용한다.

In [31]:
detach(df4)
In [32]:
c4
Error in eval(expr, envir, enclos): object 'c4' not found
Traceback:

질문/덧글

아직 질문이나 덧글이 없습니다. 첫번째 글을 남겨주세요!