[R] 자료 객체 (4): 데이터 프레임, 리스트
2018. 6. 4. 14:16
이번 글에서는 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를 삽입하면 된다.
- 문자형(character)으로 하고 싶다면 뒤에
아래는 예시.
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 취소
'기타 공부' 카테고리의 다른 글
JLPT N2 준비 후기 (공부 방법론, 썼던 교재 등) (1) | 2020.02.03 |
---|---|
[R] 조건문 (if) (1) | 2018.06.05 |
[R] 문자열 합치기: Paste 함수 (0) | 2018.06.04 |
[R] 함수 만들기 기초 (0) | 2018.06.03 |
[R] 자료 객체 (3): 배열 (array) (0) | 2018.06.03 |