내장함수, 변수 타입과 데이터 구조
R 내장 함수로 데이터 추출하기
- dplyr 패키지를 사용하지 않고 R 내장 함수만 사용해도 데이터를 추출할 수 있다.
- dplyr이 내장 함수에 비해 사용하기 쉽고 처리 속도도 빠르다. 하지만 다른 사용자들의 코드를 이해하기 위해 내장함수도 알아야 한다.
- 내장 함수는 다른 함수들과 조합해 활용할 수 있다.
행 번호로 행 추출하기
-
데이터 준비
exam <- read.scv("csv_exam.csv")
- 내장 함수는 프레임명 뒤에 []로 조건을 입력한다
- 아무 조건이 없으면 전체 데이터를 출력
exam[]
- 조건 지정
- 쉼표 왼쪽 : 행에 대한 조건
- 쉼표 오른쪽 : 열(변수)에 대한 조건
exam[1,] # 1행 추출 id class math english science 1 1 1 50 98 50 exam[2,] # 2행 추출 id class math english science 2 2 1 60 97 60
조건을 충족하는 행 추출하기
-
조건에 맞는 행 추출
exam[exam$class == 1,] # class가 1인 행 exam[exam$math >= 80,] # 수학 점수가 80점 이상인 행
-
&
,|
를 사용해 하나이상의 조건지정- 내장 함수에서는 조건을 입력할 때 변수명 앞에 데이터 프레임 이름을 반복해 써야 한다
exam[exam$class == 1 & exam$math >= 50,] # 1반 이면서 수학 점수가 50점 이상 exam[exam$english < 90 | exam$science < 50,] # 영어가 90 미만이거나 과학이 50 미만
변수명으로 변수 추출하기
- 데이터에 변수가 많으면 인덱스 값을 알아내기 힘들기 때문에 변수를 추출할 때는 변수명을 활용한다.
-
변수명 추출 : 쉼표 오른쪽에 따옴표와 함께 변수명을 입력
exam[, "class"] # class 변수 추출 exam[, "math"] # math 변수 추출
-
c()
를 이용해 여러 변수 동시에 추출 가능exam[,c("class","math","english")]
행, 변수 동시 추출하기
-
쉼표 양쪽에 조건을 입력
exam[1,3] # 행, 변수 모두 인덱스 exam[5, "english"] # 행 인덱스, 열 변수명 exam[exam$math >= 50, "english"] # 행 부등호 조건, 열 변수명 exam[exam$math >= 50, c("english", "science")] # 행 부등호 조건, 열 변수명
dplyr과 내장 함수의 차이
-
수학 점수 50 이상, 영어 점수 80 이상인 학생들을 대상으로 각 반의 전 과목 총평균을 구하라.
# 내장함수 exam$tot <- (exam$math + exam$english + exam$science)/3 aggregate(data=exam[exam$math >= 50 & exam$english >= 80,], tot~class, mean) # dplyr exam %>% filter(math >= 50 & english >= 80) %>% mutate(tot = (math + english + science)/3) %>% group_by(class) %>% summarise(mean = mean(tot))
-
dplyr 코드가 논리의 흐름대로 구조화되어 있어서 내장함수보다 가독성이 높고 이해하기 쉽다.
변수 타입
변수의 종류
- 연속 변수와 범주 변수로 구분한다.
- 변수의 값이 똑같이 숫자로 되어있어도 변수 종류가 무엇인지에 따라 사용할 수 있는 분석 방법이 다르다.
연속변수
- Numeric 타입
- 키, 몸무게, 소득처럼 연속적이고 크기를 의미하는 값으로 구성된 변수
- 숫자가 크기를 지니기 때문에 산술을 할 수 있다.
- 양적 변수라고도 한다.
- R에서 연속 변수는
numeric(뉴머릭)
으로 표현된다.범주변수
- Factor 타입
- 값이 대상을 분류하는 의미를 지니는 변수
- 성별변수 : 남자는 1, 여자는 2 > 각 범주를 분류한다.
- 숫자가 크기를 의미하지 않기 때문에 산술을 할 수 없다.
- 숫자가 대상을 지칭하는 이름과 같은 역할을 하기 때문에
명목변수
라고도 한다. - R에서 범주 변수는
factor(펙터)
로 표현된다.
변수 타입 간 차이
-
타입 변수 생성
var1 <- c(1,2,3,1,2) #numeric 변수 생성 var2 <- factor(c(1,2,3,1,2)) #factor 변수 생성
-
출력
> var1 [1] 1 2 3 1 2 > var2 [1] 1 2 3 1 2 Levels: 1 2 3
Levels
: 값이 어떤 범주로 구성되는지 의미- factor 변수는 Levels 정보를 지니고 있다.
-
factor는 연산이 안 된다
var2 + 2 [1] NA NA NA NA NA Warning message: In Ops.factor(var2, 2) : 요인(factors)에 대하여 의미있는 ‘+’가 아닙니다.
- foctor 변수는 데이터가 범주이기 때문에 연산할 수 없다.
- 변수 타입 확인하기
class()
를 이용하면 변수의 타입이 무엇인지 확인할 수 있다.
class(var1) [1] "numeric" class(var2) [1] "factor"
- factor의 구성 범주 확인하기
levels()
를 이용하면 factor 변수의 값이 어떤 범주로 구성되는지 알 수 있다.
levels(var1) NULL levels(var2) [1] "1" "2" "3"
-
문자로 구성된 factor 변수
var3 <- c("a","b","b","c") var4 <- factor(c("a","b","b","c")) var3 [1] "a" "b" "b" "c" var4 [1] a b b c Levels: a b c
- 숫자와 똑같다.
-
class()
를 사용하면 타입을 알 수 있다.class(var3) [1] "character" class(var4) [1] "factor"
- 함수마다 적용 가능한 변수 타입이 다르다.
- 함수를 활용하려면 먼저 변수가 함수에 적용할 수 있는 타입인지 확인해야 함.
> mean(var1) [1] 1.8 > mean(var2) [1] NA Warning message: In mean.default(var2) : 인자가 수치형 또는 논리형이 아니므로 NA를 반환합니다
- var2는 factor 타입이기 때문에 경고메시지가 출력된다.
변수 타입 바꾸기
- 함수를 실행했는데 이상한 결과가 나왔다면 변수가 함수에 적용할 수 있는 타입인지 확인해야 한다.
- 타입이 맞지 않다면 함수에 적용할 수 있도록 변환해야 한다.
- 변수 타입 변환하기
- var2를 numeric으로 변환
> var2 <- as.numeric(var2) > mean(var2) [1] 1.8
- 변환하면 factor 타입이 아니게 된다.
> class(var2) [1] "numeric" > levels(var2) NULL
- as.로 시작하는 함수들은 변수의 타입을 바꾸는 기능
- 이러한 함수를
변환함수
라고 한다.
데이터 구조
데이터구조 | 차원 | 특징 |
---|---|---|
벡터(Vactor) | 1차원 | 한 가지 변수 타입으로 구성 |
데이터프레임(Data Frame) | 2차원 | 다양한 변수 타입으로 구성 |
매트릭스(Matrix) | 2차원 | 한 가지 변수 타입으로 구성 |
어레이(Array) | 다차원 | 2차원 이상의 매트릭스 |
리스트(List) | 다차원 | 서로 다른 데이터 구조 포함 |
데이터 구조 비교
- 벡터
- 하나의 값 또는 여러 개의 값으로 구성된 데이터 구조
- 여러 변수 타입을 섞을 수 없고, 한 가지 타입으로만 구성할 수 있다.
> a<-1 > a [1] 1 > b<-"hello" > b [1] "hello" > class(a) [1] "numeric" > class(b) [1] "character"
- 데이터 프레임
- 행과 열로 구성된 2차원 데이터 구조
- 다양한 변수 타입으로 구성할 수 있다.
> x1 <- data.frame(var1 = c(1,2,3), + var2 = c("a","b","c")) > x1 var1 var2 1 1 a 2 2 b 3 3 c > class(x1) [1] "data.frame"
- 매트릭스
- 행과 열로 구성된 2차원 데이터 구조
- 데이터 프레임과 다르게 한 가지 변수 타입으로만 구성할 수 있다.
# 1~12로 2열 > x2 <- matrix(c(1:12), ncol = 2) > x2 [,1] [,2] [1,] 1 7 [2,] 2 8 [3,] 3 9 [4,] 4 10 [5,] 5 11 [6,] 6 12 > class(x2) [1] "matrix"
- 어레이
- 2차원 이상으로 구성된 매트릭스
- 한 가지 변수 타입으로만 구성할 수 있다.
# 1~20으로 2행 * 5열 * 2차원 > x3 <- array(1:20, dim = c(2,5,2)) > x3 , , 1 [,1] [,2] [,3] [,4] [,5] [1,] 1 3 5 7 9 [2,] 2 4 6 8 10 , , 2 [,1] [,2] [,3] [,4] [,5] [1,] 11 13 15 17 19 [2,] 12 14 16 18 20 > class(x3) [1] "array"
- 리스트
- 모든 데이터 구조를 포함하는 데이터 구조
- 여러 데이터 구조를 합해 하나의 리스트로 만들 수 있다.
> x4 <- list(f1 = a, + f2 = x1, + f3 = x2, + f4 = x3) > x4 $f1 [1] 1 $f2 var1 var2 1 1 a 2 2 b 3 3 c $f3 [,1] [,2] [1,] 1 7 [2,] 2 8 [3,] 3 9 [4,] 4 10 [5,] 5 11 [6,] 6 12 $f4 , , 1 [,1] [,2] [,3] [,4] [,5] [1,] 1 3 5 7 9 [2,] 2 4 6 8 10 , , 2 [,1] [,2] [,3] [,4] [,5] [1,] 11 13 15 17 19 [2,] 12 14 16 18 20
- 함수의 결과물이 리스트 형태로 반환되는 경우가 많기 때문에 R에서 중요한 데이터 구조이다.
- 함수의 결과물에서 특정 값을 추출할 수 있다.
> mpg <- ggplot2::mpg > x <- boxplot(mpg$cty) $stats [,1] [1,] 9 [2,] 14 [3,] 17 [4,] 19 [5,] 26 attr(,"class") 1 "integer" $n [1] 234 $conf [,1] [1,] 16.48356 [2,] 17.51644 $out [1] 28 28 33 35 29 $group [1] 1 1 1 1 1 $names [1] "1" > x$stats[,1] # 요약 통계량 추출 [1] 9 14 17 19 26 > x$stats[,1][3] # 중앙값 추출 [1] 17 > x$stats[,1][2] # 1분위수 추출 [1] 14