10.4 데이터 프레임의 구성요소에 접근하기

데이터 프레임의 구성요소(행과 열)에 접근하는 방법에는 리스트식 접근 또는 행렬식 접근 방법이 있습니다.

10.4.1 리스트 접근

데이터 프레임의 컬럼(열)에 대한 접근은 리스트처럼 [ ], [[]], 또는 $ 등을 이용하여 접근할 수 있습니다.

이러한 데이터 프레임 컬럼의 접근 결과를 변수 할당연산자로 할당하면 이것을 컬럼을 선택(select)한다고 합니다.

## []를 이용하여 데이터 프레임의 컬럼에 접근할 수 있습니다.
## 반환되는 결과들은 "데이터 프레임"의 구조입니다.
emp.data1[c(1, 3)]                    # 컬럼의 위치를 정수형 벡터로 표현할 수 있습니다.
emp.data1[c("emp_id", "salary")]      # 문자형 벡터로 표현할 수 있습니다. 
emp.data1[c(F, T, F, F)]              # 논리형 벡터로 표현할 수 있습니다.

## [[]]를 이용하여 데이터 프레임의 특정 컬럼에 접근할 수 있습니다.
## 반환되는 결과는 "벡터" 구조입니다.
emp.data1[[2]]                        # 컬럼의 위치를 정수형으로 지정합니다.
emp.data1[["emp_name")]]              # 원하는 컬럼의 이름을 문자열로 지정합니다.
emp.data1[[c(F, T, F, F)]]            # 논리형 벡터로는 특정 컬럼을 지정할 수 없습니다.

## $기호를 이용하여 데이터 프레임의 특정 컬럼에 접근하기 위해서는 컬럼의 이름을 지정합니다.
## 반환되는 결과는 "벡터" 구조입니다.
emp.data1$"emp_name"                  # 원하는 컬럼의 이름을 문자열로 지정합니다.
## Error: <text>:10:22: 예기치 않은 ')'입니다
## 9: emp.data1[[2]]                        # 컬럼의 위치를 정수형으로 지정합니다.
## 10: emp.data1[["emp_name")
##                          ^

[[또는 $ 기호를 이용한 접근은 유사한 면이 있습니다. [로 접근하면 복수 개의 컬럼에 접근할 수 있고 접근한 결과를 데이터 프레임 구조로 결과를 반환하는 반면에 [[]]$ 를 이용하면 하나의 컬럼에 대해서만 접근할 수 있고 그 결과를 벡터로 반환한다는 점에서 차이점이 있습니다.

10.4.2 행렬 접근

데이터 프레임은 행과 열에 대한 인덱스를 제공하고 있기 때문에 행렬처럼 액세스 할 수도 있습니다.

이를 설명하기 위해 R에서 이미 사용 가능한 데이터 세트를 사용합니다.

사용 가능한 데이터 세트는 명령 library(help = "datasets") 또는 data() 함수로 나열 할 수 있습니다.

library(help = "datasets")

# 또는
data()

## 특정 패키지에서 제공하는 데이터 세트를 확인할 수도 있습니다. (예; nycflights13 패키지)
data(package="nycflights13")   # nycflights13 패키지에 있는 데이터 세트를 보여 줍니다.

다음에서는 trees 데이터 세트를 이용해서 행렬식 접근을 해 보겠습니다. 이 trees 데이터 세트는 검은 체리 나무의 둘레(Girth), 높이(Height) 그리고 부피(Volume)에 대한 데이터를 포함하고 있습니다.

# trees 데이터 세트의 구조를 파악합니다.
str(trees)                    # 31개의 행과 3개의 컬럼으로 구성된 것을 확인할 수 있습니다.
## 'data.frame':    31 obs. of  3 variables:
##  $ Girth : num  8.3 8.6 8.8 10.5 10.7 10.8 11 11 11.1 11.2 ...
##  $ Height: num  70 65 63 72 81 83 66 75 80 75 ...
##  $ Volume: num  10.3 10.3 10.2 16.4 18.8 19.7 15.6 18.2 22.6 19.9 ...
# 데이터를 확인합니다.
head(trees, 3)                # 데이터 세트의 앞에 있는 3개의 데이터를 확인합니다.
##   Girth Height Volume
## 1   8.3     70   10.3
## 2   8.6     65   10.3
## 3   8.8     63   10.2
tail(trees, 5)                # 데이터 세트의 맨 뒤에 있는 5개의 데이터를 확인합니다.
##    Girth Height Volume
## 27  17.5     82   55.7
## 28  17.9     80   58.3
## 29  18.0     80   51.5
## 30  18.0     80   51.0
## 31  20.6     87   77.0
## 행렬식 접근을 해 보겠습니다.
# 행의 접근
trees[2:3,]                   # 2번째, 3번째 행의 모든 컬럼을 반환합니다. (정수형 벡터)
##   Girth Height Volume
## 2   8.6     65   10.3
## 3   8.8     63   10.2
trees[trees$Height > 82,]     # Height 컬럼의 조건( > 82)을 만족하는 행을 반환합니다.
##    Girth Height Volume
## 6   10.8     83   19.7
## 17  12.9     85   33.8
## 18  13.3     86   27.4
## 31  20.6     87   77.0
                              # 이러한 행의 선택을 필터링한다고 합니다. (filtering)
# 열의 접근
trees[ , 2:3]                 # 2번째, 3번째 열의 모든 행을 반환합니다 (selection)
##    Height Volume
## 1      70   10.3
## 2      65   10.3
## 3      63   10.2
## 4      72   16.4
## 5      81   18.8
## 6      83   19.7
## 7      66   15.6
## 8      75   18.2
## 9      80   22.6
## 10     75   19.9
## 11     79   24.2
## 12     76   21.0
## 13     76   21.4
## 14     69   21.3
## 15     75   19.1
## 16     74   22.2
## 17     85   33.8
## 18     86   27.4
## 19     71   25.7
## 20     64   24.9
## 21     78   34.5
## 22     80   31.7
## 23     74   36.3
## 24     72   38.3
## 25     77   42.6
## 26     81   55.4
## 27     82   55.7
## 28     80   58.3
## 29     80   51.5
## 30     80   51.0
## 31     87   77.0
# 행과 열의 동시 접근
trees[10:12,2]                # 10~12번째의 2번깨 컬럼 값을 반환합니다. (벡터 반환)
## [1] 75 79 76
trees[10:12, 2, drop = FALSE] # 데이터 프레임으로 반환합니다.
##    Height
## 10     75
## 11     79
## 12     76

한 개의 컬럼에 대하여 반환할 때는 그 결과가 벡터 형으로 반환됩니다. 이를 데이터 프레임 형태로 반환하고 싶을 때에는 drop = FALSE 인수를 설정해 주면 됩니다.