◎ 데이터프레임 인덱싱(indexing)
> number = 1:10
> score = c(90,85,83,75,63,55,97,80,77,59)
> gender = c('M','F','M','M','F','M','M','F','F','M')
> student = data.frame(number, score, gender)
> print(student)
number score gender
1 1 90 M
2 2 85 F
3 3 83 M
4 4 75 M
5 5 63 F
6 6 55 M
7 7 97 M
8 8 80 F
9 9 77 F
10 10 59 M
> cat(student)
Error in cat(student) :
타입 'list'인 인자 1는 'cat'에 의하여 다루어 질 수 없습니다
벡터 3개를 이용해 데이터프레임을 만들었다.
칼럼의 이름을 지정해주지 않으면 각 벡터의 이름이 칼럼이름으로 들어간 것을 알 수 있다.
리스트와 마찬가지로 데이터프레임도 cat()함수로 출력할 수 없다.
- 달러사인 $
> student$score
[1] 90 85 83 75 63 55 97 80 77 59
> max(student$score)
[1] 97
달러사인 뒤에 칼럼이름을 써서 해당 데이터에 접근할 수 있다.
달러사인을 사용하면 반환되는 출력 자료형은 벡터이다.
- 객체[행,칼럼]
> student[,1]
[1] 1 2 3 4 5 6 7 8 9 10
> student[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
> student[1]
number
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
> student['number']
number
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
> student[c(T,F,F)]
number
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
5개의 코드 모두 첫번째 칼럼의 데이터에 접근하는 방법이다.
객체[,1] 과 객체[[1]]은 달러사인과 같이 벡터 자료형을 출력한다.
객체[1] 과 객체['칼럼이름']은 데이터프레임 자료형을 출력한다.
TRUE or FALSE 로 칼럼을 검색할 수도 있다.
> student[,1,drop=F]
number
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
결과가 벡터로 반환되는 것이 싫다면 drop=FALSE 옵션을 추가해주면 된다.
> student[2,]
number score gender
2 2 85 F
> student[c(2,3,4),]
number score gender
2 2 85 F
3 3 83 M
4 4 75 M
> student[2:4,]
number score gender
2 2 85 F
3 3 83 M
4 4 75 M
행을 검색할 때는 콤마를 꼭 써주고, 콤마 앞부분에 검색하고 싶은 행 인덱스 or 행 이름을 넣으면 된다.
> student[2,2]
[1] 85
> student[2:3,2:3]
score gender
2 85 F
3 83 M
데이터프레임의 원소 하나만 검색하면 벡터를 반환하고,
행을 검색하거나 원소를 두개 이상 검색하면 데이터프레임을 반환한다.
- 값 추가
> nrow(student)
[1] 10
> student$english = LETTERS[1:nrow(student)]
> student
number score gender english
1 1 90 M A
2 2 85 F B
3 3 83 M C
4 4 75 M D
5 5 63 F E
6 6 55 M F
7 7 97 M G
8 8 80 F H
9 9 77 F I
10 10 59 M J
nrow() 함수는 객체의 행의 갯수를 반환해준다.
이 함수를 영어대문자를 저장하고 있는 내장형 함수 LETTERS의 인덱스로 활용하면 기존 데이터프레임 행의 길이만큼 데이터를 자를 수 있고, 새로운 칼럼을 만들어 값을 추가할 수 있다.
※ 내장형 함수의 종류는 'R 스칼라 Scalar' 글에 업로드 되어있다.
- 값 제외
> student[-4]
number score gender
1 1 90 M
2 2 85 F
3 3 83 M
4 4 75 M
5 5 63 F
6 6 55 M
7 7 97 M
8 8 80 F
9 9 77 F
10 10 59 M
> student[-c(4:10),]
number score gender english
1 1 90 M A
2 2 85 F B
3 3 83 M C
- 값 치환
> length(student)
[1] 4
> length(student$english)
[1] 10
> student$english = letters[1:length(student$english)]
> student
number score gender english
1 1 90 M a
2 2 85 F b
3 3 83 M c
4 4 75 M d
5 5 63 F e
6 6 55 M f
7 7 97 M g
8 8 80 F h
9 9 77 F i
10 10 59 M j
length() 함수는 데이터의 길이를 반환한다. 데이터프레임 객체는 넣으면 칼럼의 갯수를 반환하기 때문에 달러사인으로 칼럼하나를 불러오면 nrow() 함수와 마찬가지로 행의 갯수가 반환된다.
이번엔 영어소문자를 저장하고 있는 내장형함수 letters를 이용해 값을 치환하였다.
- 조건식
> student[student$score>80,]
number score gender english
1 1 90 M a
2 2 85 F b
3 3 83 M c
7 7 97 M g
> student$score[student$score > 80]
[1] 90 85 83 97
- %in%
> student[student$english %in% c('a','b'),]
number score gender english
1 1 90 M a
2 2 85 F b
◎ 데이터프레임 관련 함수
- head()
> head(student)
number score gender english
1 1 90 M a
2 2 85 F b
3 3 83 M c
4 4 75 M d
5 5 63 F e
6 6 55 M f
> head(student, 3)
number score gender english
1 1 90 M a
2 2 85 F b
3 3 83 M c
head() 함수는 기본적으로 위에서부터 6개의 행을 출력하고, 객체뒤에 출력할 행의 객수를 지정해 줄 수 있다.
이는 tail() 함수도 동일하다.
- tail()
> tail(student)
number score gender english
5 5 63 F e
6 6 55 M f
7 7 97 M g
8 8 80 F h
9 9 77 F i
10 10 59 M j
> tail(student, 2)
number score gender english
9 9 77 F i
10 10 59 M j
- str()
> student = student[-4] # english 칼럼 제거
> str(student)
'data.frame': 10 obs. of 3 variables:
$ number: int 1 2 3 4 5 6 7 8 9 10
$ score : num 90 85 83 75 63 55 97 80 77 59
$ gender: chr "M" "F" "M" "M" ...
>
> student = data.frame(number, score, gender, stringsAsFactors=T)
> str(student)
'data.frame': 10 obs. of 3 variables:
$ number: int 1 2 3 4 5 6 7 8 9 10
$ score : num 90 85 83 75 63 55 97 80 77 59
$ gender: Factor w/ 2 levels "F","M": 2 1 2 2 1 2 2 1 1 2
str() 함수는 객체의 구조(structure)를 출력한다.
stringsAsFactors=TRUE 를 지정해주면 문자형 칼럼이 요인형(Factor)으로 바뀌어진다.
반대로 FALSE 를 지정해주면 요인형 칼럼이 문자형으로 바뀐다.
- rownames(), colnames(), names()
> rownames(student)
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10"
> colnames(student)
[1] "number" "score" "gender"
> names(student)
[1] "number" "score" "gender"
colnames() 함수와 names() 함수는 결과가 같다.
> rownames(student) = letters[1:10]
> student
number score gender
a 1 90 M
b 2 85 F
c 3 83 M
d 4 75 M
e 5 63 F
f 6 55 M
g 7 97 M
h 8 80 F
i 9 77 F
j 10 59 M
- rbind(), cbind()
> A = student[1:5,]; A
number score gender
a 1 90 M
b 2 85 F
c 3 83 M
d 4 75 M
e 5 63 F
> B = student[6:10,]; B
number score gender
f 6 55 M
g 7 97 M
h 8 80 F
i 9 77 F
j 10 59 M
> rbind(A,B)
number score gender
a 1 90 M
b 2 85 F
c 3 83 M
d 4 75 M
e 5 63 F
f 6 55 M
g 7 97 M
h 8 80 F
i 9 77 F
j 10 59 M
cbind() 함수도 행의 길이가 동일하다면 위와 같은 방법으로 하나의 데이터프레임을 만들 수 있다.
※ R 데이터프레임 DataFrame 이전내용
<R 데이터프레임 DataFrame - 인덱싱/관련함수>
'R > Data Type' 카테고리의 다른 글
R 자료형/자료구조 - 판별과 변환 (0) | 2020.10.26 |
---|---|
R 데이터프레임 DataFrame - 생성과 저장 text/csv/excel파일 (0) | 2020.10.19 |
R 배열 Array - 생성/인덱싱 (0) | 2020.10.16 |
R 행렬 Matrix - 생성/연산/인덱싱 (0) | 2020.10.14 |
R 리스트 List - 생성/관련함수/인덱싱 (0) | 2020.08.11 |
댓글