Untitled

이번 글에서는 R의 데이터 객체 유형 중 데이터 프레임과 리스트를 다뤄보고자 한다.

데이터 프레임

  • 데이터 프레임은 변수(column)와 관찰치(row)로 구성된 2차원 자료 객체이다.
  • 각 열은 하나의 벡터로 인식되며, 벡터가 같은 데이터 유형을 갖듯 열의 요소들도 같은 데이터 유형을 갖는다.
    • 데이터 프레임 속의 열들의 길이는 동일해야 한다.
  • 서로 다른 열은 다른 데이터 유형을 가질 수 있다.

  • 데이터 프레임은 다음과 같이 생성한다.
  • data.frame(..., row.names = NULL, check.rows = FALSE, check.names = TRUE)
    • …의 자리에는 벡터, 행렬, 리스트, 심지어는 다른 데이터 프레임 등 객체가 온다.
    • row.names : 행들의 이름. NULL은 기본값 (일련 번호)
    • check.rows : 결합 객체들의 행 길이가 같은지 확인
    • check.names : 이름들이 중복되는지 여부 확인
  • 유의: 문자형 변수는 범주형(factor)로 자동으로 변환된다.
    • 문자형(character)으로 하고 싶다면 뒤에 stringsAsFactors = FALSE argument를 삽입하면 된다.

아래는 예시.

x <- 1 : 7; y <- LETTERS[1 : 7] # LETTERS[]: 알파벳 대문자. cf) letters[]
z <- matrix(11 : 24, nrow = 7)
test <- data.frame(x, y, z)
test2 <- data.frame(first = x, second = y, third = z) # 각 열벡터에 이름 지정
test2 
##   first second third.1 third.2
## 1     1      A      11      18
## 2     2      B      12      19
## 3     3      C      13      20
## 4     4      D      14      21
## 5     5      E      15      22
## 6     6      F      16      23
## 7     7      G      17      24
w <- 1 : 8; # data.frame(x, y, w): 오류 출력 (row의 수가 다르기 때문.)

데이터 프레임의 속성

  • is.data.frame()은 주어진 객체가 데이터 프레임인지 확인. as.data.frame()은 주어진 객체를 데이터 프레임화.
  • nrow(), ncol(), dim() : 각각 행의 길이, 열의 길이, 차원을 반환.
  • names() : 변수명 확인


is.data.frame(test)
## [1] TRUE
is.data.frame(z) 
## [1] FALSE
z_data_frame <- as.data.frame(z) # 행렬 z를 데이터 프레임화 
is.data.frame(z_data_frame)
## [1] TRUE
dim(test); nrow(test); ncol(test) #차원, 행 갯수, 열 갯수
## [1] 7 4
## [1] 7
## [1] 4
rownames(test) # 행 이름 출력
## [1] "1" "2" "3" "4" "5" "6" "7"
colnames(test) <- c("first", "second", "third", "fourth") # 열 이름 지정
head(test); tail(test) # 데이터 프레임 일부만 출력. cf. head(test, n = k)으로 k번째까지 출력한다는 옵션 지정 가능. 
##   first second third fourth
## 1     1      A    11     18
## 2     2      B    12     19
## 3     3      C    13     20
## 4     4      D    14     21
## 5     5      E    15     22
## 6     6      F    16     23
##   first second third fourth
## 2     2      B    12     19
## 3     3      C    13     20
## 4     4      D    14     21
## 5     5      E    15     22
## 6     6      F    16     23
## 7     7      G    17     24

데이터 프레임의 인덱스

  • 벡터, 행렬에서 하는 것처럼 대괄호[]를 사용하여 인덱스를 지정할 수 있다.
    • data_frame_name$component_name
num <- 1:5
char <- letters[1:5]
nat <- c("USA", "Japan", "China", "Russia", "South Korea")
df <- data.frame(obs = num, letter = char, nation = nat)

df$nation # nation 열에 포함된 데이터 모두 출력 
## [1] USA         Japan       China       Russia      South Korea
## Levels: China Japan Russia South Korea USA
df[1, 2] # 1번째 행, 2번째 열의 데이터 
## [1] a
## Levels: a b c d e
df[, 3]
## [1] USA         Japan       China       Russia      South Korea
## Levels: China Japan Russia South Korea USA
df[, 2:3]
##   letter      nation
## 1      a         USA
## 2      b       Japan
## 3      c       China
## 4      d      Russia
## 5      e South Korea
df[1:3, ]
##   obs letter nation
## 1   1      a    USA
## 2   2      b  Japan
## 3   3      c  China
class(df[, "nation"]) 
## [1] "factor"
df[, c("letter", "nation")]
##   letter      nation
## 1      a         USA
## 2      b       Japan
## 3      c       China
## 4      d      Russia
## 5      e South Korea
nat1 <- df[, "nation", drop = FALSE] # drop = FALSE 옵션: 데이터 프레임 반환 지정
nat2 <- df[, "nation"] # drop = FALSE가 없으면 벡터 반환 

리스트

  • 리스트는 여러 데이터 객체들을 한꺼번에 자유롭게 취급할 수 있는 데이터 유형이다.
    • 벡터, 행렬, 데이터 프레임, 그리고 리스트 자신도 요소가 될 수 있다.
  • list() 이용
  • name(): 이름 할당 가능
mat <- matrix(1:6, nrow = 2, ncol = 3)
list1 <- list(c(1:3), mat, c("a", "b", "c"), 5:8); list1
## [[1]]
## [1] 1 2 3
## 
## [[2]]
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6
## 
## [[3]]
## [1] "a" "b" "c"
## 
## [[4]]
## [1] 5 6 7 8
list2 <- list(list1, df); list2 # 데이터 프레임도 요소로 취급 가능 
## [[1]]
## [[1]][[1]]
## [1] 1 2 3
## 
## [[1]][[2]]
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6
## 
## [[1]][[3]]
## [1] "a" "b" "c"
## 
## [[1]][[4]]
## [1] 5 6 7 8
## 
## 
## [[2]]
##   obs letter      nation
## 1   1      a         USA
## 2   2      b       Japan
## 3   3      c       China
## 4   4      d      Russia
## 5   5      e South Korea
names(list1) <- c("A", "B", "C", "D"); list1
## $A
## [1] 1 2 3
## 
## $B
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6
## 
## $C
## [1] "a" "b" "c"
## 
## $D
## [1] 5 6 7 8
  • 리스트 인덱싱은?
list1[[1]]
## [1] 1 2 3
list2[[2]]
##   obs letter      nation
## 1   1      a         USA
## 2   2      b       Japan
## 3   3      c       China
## 4   4      d      Russia
## 5   5      e South Korea
list2[[2]]$nation
## [1] USA         Japan       China       Russia      South Korea
## Levels: China Japan Russia South Korea USA
list2[[2]][1] # 하위 요소 출력
##   obs
## 1   1
## 2   2
## 3   3
## 4   4
## 5   5
list2[["New"]] <- c(1:10)
list2
## [[1]]
## [[1]][[1]]
## [1] 1 2 3
## 
## [[1]][[2]]
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6
## 
## [[1]][[3]]
## [1] "a" "b" "c"
## 
## [[1]][[4]]
## [1] 5 6 7 8
## 
## 
## [[2]]
##   obs letter      nation
## 1   1      a         USA
## 2   2      b       Japan
## 3   3      c       China
## 4   4      d      Russia
## 5   5      e South Korea
## 
## $New
##  [1]  1  2  3  4  5  6  7  8  9 10
length(list2)
## [1] 3
  • 요소를 호출할 때 $name 을 쓰지 않기 위해서는? attach() 사용
    • 단 요소들의 이름이 모두 지정되어 있어야 한다.
# attach(list2) : 에러 출력 

names(list2) <- c("n1", "n2", "n3"); attach(list2)
## The following objects are masked from list2 (pos = 3):
## 
##     n1, n2, n3
## The following objects are masked from list2 (pos = 4):
## 
##     n1, n2, n3
## The following objects are masked from list2 (pos = 5):
## 
##     n1, n2, n3
## The following objects are masked from list2 (pos = 6):
## 
##     n1, n2, n3
n1; n2; n3
## [[1]]
## [1] 1 2 3
## 
## [[2]]
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6
## 
## [[3]]
## [1] "a" "b" "c"
## 
## [[4]]
## [1] 5 6 7 8
##   obs letter      nation
## 1   1      a         USA
## 2   2      b       Japan
## 3   3      c       China
## 4   4      d      Russia
## 5   5      e South Korea
##  [1]  1  2  3  4  5  6  7  8  9 10
# detach() 명령어: attach 취소