데이터 프레임은 엑셀의 스프레드 시트와 같이 사각형 구조를 가지고 있다. 스프레드시트가 널리 쓰이는 것처럼 R에서 가장 많이 사용되는 데이터 구조이다.그렇게 때문에 R에 익숙해지려면 데이터 프레임을 능숙하게 다룰 줄 알아야 한다. 데이터 프레임이 스프레드 시트와 다른 점이 있다면, 정확히 사각형이라야 한다는 점이다. 즉 구성하는 벡터들의 길이가 같아야 한다.
이 조건을 제외하고는 일반 리스트들과 같다. 데이터 프레임은 리스트의 특별한 형태이다.
다음과 같이 길이가 10인 벡터들이 있다.
> id<-1:10
> pt_name <- letters[1:10]
> category <- rep(c("Treat","Control"),5)
> scores <- c(35,45,56,38,45,37,23,22,30,41)
이 벡터들의 길이가 같아서 하나의 데이터 프레임으로 묶을 수 있다. 데이터 프레임을 만드는 함수는 data.frame()이다.
다음과 같이 실행해보자.
> ddf <- data.frame(id,pt_name,category,scores)
> ddf
id pt_name category scores
1 1 a Treat 35
2 2 b Control 45
3 3 c Treat 56
4 4 d Control 38
5 5 e Treat 45
6 6 f Control 37
7 7 g Treat 23
8 8 h Control 22
9 9 i Treat 30
10 10 j Control 41
-x축 column 값을 변경시켜줄 수 있다.
> colnames(ddf) <- c("id","pt_name","categogo","KT_Score")
> ddf
id pt_name categogo KT_Score
1 1 a Treat 35
2 2 b Control 45
3 3 c Treat 56
4 4 d Control 38
5 5 e Treat 45
6 6 f Control 37
7 7 g Treat 23
8 8 h Control 22
9 9 i Treat 30
10 10 j Control 41
생성된 데이터 프레임을 출력해서 보면, 아토믹 벡터나 일반적인 리스트와 다르게 2차원 적으로 출력되는 것을 확인 할 수 있다.
이렇게 데이터 프레임에는 스프레드시트와 같이 행과 열이 존재한다.
앞에서와 같이 $,[],[[]] 등을 사용하여 데이터 프레임이 가지는 요소들에 접근해보자.
> ddf$id
[1] 1 2 3 4 5 6 7 8 9 10
> ddf$pt_name
[1] a b c d e f g h i j
Levels: a b c d e f g h i j
> ddf["pt_name"]
pt_name
1 a
2 b
3 c
4 d
5 e
6 f
7 g
8 h
9 i
10 j
> ddf["categogo"]
categogo
1 Treat
2 Control
3 Treat
4 Control
5 Treat
6 Control
7 Treat
8 Control
9 Treat
10 Control
> ddf[["id"]]
[1] 1 2 3 4 5 6 7 8 9 10
> ddf[["KT_Score"]]
[1] 35 45 56 38 45 37 23 22 30 41
출력된 결과를 보면 $과 [[]]는 벡터를 출력하고, []인 경우에는 원래의 모습(data frame)을 유지한다는 것을 알 수 있다.
앞의 리스트에서 이들을 적용했던 것과 같은 결과이다. 이런 지식을 활용하여 변수 KT_Scroe 의 평균을 구해보자.
> mean(ddf[["KT_Score"]])
[1] 37.2
> mean(ddf$KT_Score)
[1] 37.2
여기에서 유용한 str()함수에 대해 알고 가자. structure 라는 의미의 이름을 가졌듯이 , 이 함수는 R의 객체에 대한 구조를 일목요연하게 보여주어서 좋다.
> str(ddf)
'data.frame': 10 obs. of 4 variables:
$ id : int 1 2 3 4 5 6 7 8 9 10
$ pt_name : Factor w/ 10 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10
$ categogo: Factor w/ 2 levels "Control","Treat": 2 1 2 1 2 1 2 1 2 1
$ KT_Score: num 35 45 56 38 45 37 23 22 30 41
결과를 보면 ddf라는 객체는 4개의 변수와 10개의 관측값을 가지고 있는 데이터 프레임이라는 것을 알려준다.
그리고 4개 변수의 이름과 변수들이 어떤 데이터 타입을 가졌는지 알려준다.
여기에 아직 다루고 있는 팩터(factor)가 있는데, 이것은 뒤에서 설명한다.
그리고 attributes()라는 함수가 있는데, 이 함수는 R 객체가 가진 속성(attributes)을 모두 알려준다. 이 함수는 R언어의 객체지향시스템을 설명할 때 다시 언급할 것인데, 객체의 메타 데이터를 확인할 때 사용한다.
> attributes(ddf)
$names
[1] "id" "pt_name" "categogo" "KT_Score"
$class
[1] "data.frame"
$row.names
[1] 1 2 3 4 5 6 7 8 9 10
결과에는 names는 열의 이름을 말하고 class에는 data.frame 이라는 것을 알려주고 있고 row.names는 행의 이름을 말한다.
이 클래스 역시 객체지향시스템을 설명할 때 다시 언급한다.
이런 데이터 프레임에 dim()이라는 함수를 적용하면 디멘션(dimesion), 즉 몇 행, 몇 열로 구성되어 있는지 알려준다.
> dim(ddf)
[1] 10 4
그 열의 이름은 names() 함수 또는 colnames() 함수로 알 수 있다.
행의 이름은 row.names()로 알 수 있다. 앞에서 ddf를 만들면서 행의 이름을 따로 부여하지 않았지만, data.frame() 함수가 데이터 프레임을 만들면서 자동으로 부여한 것이다.
> names(ddf)
[1] "id" "pt_name" "categogo" "KT_Score"
> colnames(ddf)
[1] "id" "pt_name" "categogo" "KT_Score"
> row.names(ddf)
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10"
ddf라는 데이터 프레임을 확보했을 때 데이터에 대한 요약된 정보를 얻을 때는 summary() 함수가 도움이 된다.
> summary(ddf)
id pt_name categogo KT_Score
Min. : 1.00 a :1 Control:5 Min. :22.00
1st Qu.: 3.25 b :1 Treat :5 1st Qu.:31.25
Median : 5.50 c :1 Median :37.50
Mean : 5.50 d :1 Mean :37.20
3rd Qu.: 7.75 e :1 3rd Qu.:44.00
Max. :10.00 f :1 Max. :56.00
(Other):4
이 함수는 각 열이 가진 데이터 타입에 따라서 정리된 리포트를 출력한다. KT_Score 라는 열은 이것이 숫자형(numeric 또는 double) 이기 때문에 최솟값, 제1사분위수 , 중앙값(제 2사분위수),평균, 제3사분위수, 최댓값 등을 출력한다. 반면 우리가 아직 다루지 않았지만, 팩터인 categogo 에 대해서는 각각의 레벨(level)에 대해 몇 개의 관측 값이 있는지 알려준다.
![](https://blog.kakaocdn.net/dn/bH8Uia/btqwrpv5CCA/WqUd3YzkqVRlrDiG1WG8xk/img.png)
여기에서 id라는 값은 원래 정수이기는 하지만 엄밀하게 말하면 관측 대상의 아이디이기 때문에 정수로 사용해서는 안 된다.
이런 경우에는 바꾸어 사용한다. R에서 as.*()의 형태로 된 함수들은 그 데이터 타입을 바꿀 때 사용한다.
> ddf$id <- as.character(ddf$id)
> str(ddf)
'data.frame': 10 obs. of 4 variables:
$ id : chr "1" "2" "3" "4" ...
$ pt_name : Factor w/ 10 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10
$ categogo: Factor w/ 2 levels "Control","Treat": 2 1 2 1 2 1 2 1 2 1
$ KT_Score: num 35 45 56 38 45 37 23 22 30 41
> summary(ddf)
id pt_name categogo KT_Score
Length:10 a :1 Control:5 Min. :22.00
Class :character b :1 Treat :5 1st Qu.:31.25
Mode :character c :1 Median :37.50
d :1 Mean :37.20
e :1 3rd Qu.:44.00
f :1 Max. :56.00
(Other):4
> ncol(ddf)
[1] 4
> nrow(ddf)
[1] 10
데이터 프레임의 열의 개수는 ncol() 함수로, 행의 개수는 nrow()로 확인한다.
> head(ddf)
id pt_name categogo KT_Score
1 1 a Treat 35
2 2 b Control 45
3 3 c Treat 56
4 4 d Control 38
5 5 e Treat 45
6 6 f Control 37
> tail(ddf)
id pt_name categogo KT_Score
5 5 e Treat 45
6 6 f Control 37
7 7 g Treat 23
8 8 h Control 22
9 9 i Treat 30
10 10 j Control 41
그리고 앞뒤 몇 개(기본 값 6개)의 관측값들을 보여주는 함수인 head(), tail() 함수도 자주 쓰인다.
※정리
1. data.frame() 함수는 벡터의 길이가 같은 것들을 특별한 형태로 만들어 주는 함수이다.
2. str() 함수는 R객체에 대한 구조를 정리해서 나타내준다.
3. attributes() 함수는 객체의 메타데이터 확인 시 자주 쓰이는 함수이다.
4. summary() 함수는 각 열의 데이터 타입에 따라 정리된 리포트 결과를 보여준다.
5. as.데이터타입() 함수는 데이터의 타입을 변경 시 사용한다.
6. 그외에 dim() 몇행 몇렬인지 확인 // ncol,nrow() 행 열의 개수 확인 // col,rownames() 행렬의 이름 나타냄.
7.$과 [[]]는 벡터를 출력하고, []인 경우에는 원래의 모습(data frame)을 유지한다.
'전공 > R프로그래밍' 카테고리의 다른 글
R프로그래밍 11.팩터(factor) : 카테고리형 데이터를 표현 , 행렬과 배열 (0) | 2019.07.03 |
---|---|
R프로그래밍 10. R객체의 메타 데이터 : 속성 (0) | 2019.07.02 |
R프로그래밍 8. 리스트 (0) | 2019.06.28 |
R프로그래밍 7. 규칙성을 가진 벡터 만들기 (0) | 2019.06.26 |
R프로그래밍 6. 벡터 서브세팅과 교체 (0) | 2019.06.24 |