앞서 얘기했던 Matrix와 Data Frame을 다뤄볼 차례다.
방법은 간단하다. 여러 함수를 이용해 해당 데이터의 유형, 특징 등을 파악해보는 것이다.
사용하려는 데이터에 대해 우선 이해가 있어야 나중에 적절한 알고리즘을 적용할 수 있다.
역시나 서론은 짧게, 실습은 길게.
1. IRIS 데이터
- 취급할 데이터에 대해 간략하게 알아보자
- 참고로, IRIS 데이터가 '열 단위'로 정렬되어있어, 함수의 입력도 '열 단위'로 입력됨을 유념해야 한다.
(만약, 행 단위로 정렬되어있다면 행 단위의 입력으로 바꿔야 한다.)
- iris데이터는 R studio에 탑재된 데이터로 바로 이용해볼 수 있다.
- head함수를 이용하면 데이터 맨 앞부분을 확인해볼 수 있다.
- head를 통해 데이터를 살펴보면 아래와 같다.
- 열 이름이 length와 width, species이므로 종에 따른 길이와 폭의 관계성을 알아볼 수 있는 데이터다.
※ 비록 데이터 분석을 이제 공부하는 단계라서 정확하지는 않을 수 있겠지만, 이런 컬럼명과 데이터를
보고 데이터의 특성과 어떤 결과가 나올지 유추해보는 것이 도움이 된다고 생각한다.
![]() |
2. Data Frame의 구조와 유형을 살펴보는 함수
- 설명이 필요없다. 아래 예시를 보자.
dim(iris) # 행과 열의 수 보이기. iris데이터는 '150 5' 가 나온다 nrow(iris) # 행의 수 출력. 150이 나온다 ncol(iris) # 열의 수 출력. 5가 나온다 names(iris) # 열의 이름을 출력한다. Sepal.length~(생략)~ 등 이름이 나온다 haed(iris) # 위 함수의 내용을 한번에 알 수 있다. 단, 열이 엄청 많은 데이터로 테스트해보지 않아서 # 그런 데이터는 어떻게 출력될지 모르겠다. tail(iris) # haed가 데이터 앞쪽을 보여줬다면, tail은 데이터 뒷쪽을 보여준다. str(iris) # str은 structure의 줄임말로, 데이터의 구조를 보여준다.(아래 그림 참고) ![]() unique(iris[,"Species"] # 아래 구문과 동일한 구문이다. 단, 해당 열의 '이름'을 넣어줬을 뿐이다. ![]() |
3. Data Frame의 연산
- 말로 설명하는 것보다 예시를 보는 것이 낫다.
colSums(iris[,-5]) # 5번째 열을 제외하고 1,2,3,4번째 열의 합계를 출력한다. # 참고로 인풋값으로는 숫자(numeric)만 들어가야 하기에 5번째 열을 지웠다. colMeans(iris[,-5]) # Mean이 평균이므로 각 열의 평균값이 출력된다. rowSums(iris[,-5]) # 중요한 점은 행의 연산을 하더라도 인풋값은 변함 없다는 것이다. # 즉, 연산이 불가능한 행이나, 열은 제외해야 한다. 참고로 출력값은 아래와 같이 나온다. # 데이터의 맨 앞의 숫자가 시작 데이터의 행번호를 출력한다. 즉, 10.2는 1행, 9.5는 2행,~ # 14행은 8.5가 된다. 그럼 맨 끝의 9.8은? 세보면 26행이다. ![]() rowMeans(iris[,-5]) # 행별 평균값이 출력된다. |
4. 조건에 맞는 표본 추출
- IRIS는 열단위로 정렬되어 있으므로, 추출은 행단위로 이뤄진다.
- 주의할점은 subset은 디폴트로 Data Frame을 입력받도록 되어있다. 따라서, Matrix를 입력하는 경우에는
subset(대상 매트릭스, 추출 조건, drop=FALSE) 형태로 입력해야 한다.
- help(subset)을 통해 왜 drop이 추가됐는지 개별적으로 확인해보자.
a <- subset(iris, Species=="setosa") # iris테이블에서 Species가 setosa인 행을 추출. setosa 표본 50개가 저장된다. a <- subset(iris, Sepal.Length<5.0 & Sepal.Width>3.0) # Length가 5.0보다 작고 Width가 3.0보다 큰 표본을 추출한다. 표본 13개가 저장된다. |
5. Matrix의 연산
- 주로, Data Frame을 이용하게 되겠지만 Matrix의 연산도 기본적으로 알아두자
a <- matrix(1:20,4,5) # 앞선 Matrix소개글에서는 'nrow=', 'ncol='을 붙였지만 사실 안붙여도 된다. b <- matrix(21:40,4,5) # 'byrow=TRUE'가 설정되지 않았으니 디폴트로 열 우선으로 채워진다. a+b; a-b; a*b # 같은 위치의 원소끼리 연산이 된다.(행렬의 연산 아님 주의) a%*%b; # 행렬곱셈 결과가 출력됨 a*3; b-5; # matrix의 각 원소에 정수(*3, -5)에 해당하는 연산을 수행 |
6. 데이터 타입의 확인
- 그냥 얼핏보면 Matrix와 Data Frame은 형태가 동일해 보이지만 행번호에 대괄호가 있고 없고의 차이가 있다.
[예시] Matrix![]() |
[예시] Data Frame![]() |
- 하지만, 우리는 멋드러지게 함수로 확인을 해보도록하자.
is.matrix(iris) # matrix가 맞으면 TRUE, 틀리면 FALSE를 출력한다. is.data.frame(a) # data frame이 맞으면 TRUE, 틀리면 FALSE를 출력한다. is.vector(벡터) # 함수명만 보고도 알겠지만, 벡터인지 여부를 확인하는 함수이다. class(iris) # iris가 무엇인지 "matrix" or "data.frame"으로 출력된다. # 참고로 숫자 원소가 들어간 일반 벡터는 "numeric", 문자가 들어간 벡터는 "character"로 출력 |
7. Matrix ↔ Data Frame간 변환
- 함수를 이용하다보면 각 데이터 타입별로 이용 가능한 함수가 존재한다.
- 이럴때는 변환함수를 이용해보도록 하자.
class(iris) #iris는 당연히 Data Frame이다. e <- as.matrix(iris[,1:4]) #1:4열만 Matrix로 변환하라는 뜻이다. class(e) #iris가 변환되었기에 e는 "matrix"로 출력된다. e <- data.frame(e) #e를 Data Frame으로 변환한다. class(e) #당연하게도, Data Frame으로 출력된다. |
이상으로 데이터 Matrix 및 Data Frame에 관한 연산을 마친다.
사실 이것보다 더 많지만, 마냥 함수만 배우는 것 보다 실제 분석을 하면서
함수를 사용하는 것이 효과적이기 때문에, 그때 그때 정의를 찾아보면서 실습해보도록 하겠다.
'데이터와 AI > R 기초' 카테고리의 다른 글
[R기초-6] R sudio를 통해 파일 읽고 쓰기 (0) | 2021.01.11 |
---|---|
[R기초-4] Data Frame 생성 및 이용 (0) | 2021.01.08 |
[R기초-3] Matrix란 (0) | 2021.01.07 |
[R기초-2] 벡터의 연산, 함수, 논리값 (0) | 2021.01.03 |
[R기초-1] 벡터의 정의와 함수 (2) | 2020.12.22 |