여러 행과 여러 열로 형성되어 있는 Data Frame에서
원하는 조건의 값을 따로 빼오며 계산하고 싶을 때가 많다.
방법은 여러가지가 존재한다.
그 중 필자가 가장 즐겨쓰는 방법은 2가지이다.
하나는 subset()
함수
다른 하나는 []
를 이용한 Indexing 추출이다.
이번엔 대괄호[]
를 이용한 방법에 대해 설명하려한다.
우선
R의 내장 데이터인 Iris 데이터를 사용하려 한다.
iris
str(iris)
> str(iris)
'data.frame': 150 obs. of 5 variables:
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
🕶 str()
함수를 통해 해당 Data Frame을 구성하는 Columns 확인할 수 있다.
150 obs.
(150개의 값들)
5 variables
(다섯 종류의 구성)
구성으로는
숫자(num)로 이루어져 있는 열 4개(Sepal.Length
, Sepal.Width
, Petal.Length
, Petal.Width
)와
종을 나타내는 Factor 열(Species
) 1개로 이루어져 있다.
[]
를 사용하면 정말 다양한 방법으로 추출할 수 있다.
#1열
iris[1]
iris[,1]
#1행
iris[1,]
#1행 1열
iris[1,1]
#1,2,3행
iris[c(1,2,3),]
#1,2,3열
iris[c(1,2,3)]
iris[,c(1,2,3)]
#2행 / 2열 제외
iris[-2,]
iris[-2]
여러 연속되는 행/열이나 떨어져있는 여러 행/열도
c()
를 통해서 편하게 추출할 수 있다.
str()
을 통해 알아보았던 Column name을 확인하여 추출해 보자#Sepal.Width 열
iris["Sepal.Width"]
iris[,"Sepal.Width"]
iris$Sepal.Width # Data Frame형태가 아닌 'Vector'형태
*$
를 통해 추출할 땐, Vector형태로 추출되는 점 주의
# [ (조건식) , (추출 범위) ]
# Sepal.Width가 2이상 이고 Sepal.Length가 4이상인
# Species 열의 값 추출
iris[iris$Sepal.Width >= 3 & iris$Sepal.Length >= 4, "Sepcies"]
#위와 같은 조건으로 Petal.Width 열과 Species열 추출
iris[iris$Sepal.Width >= 3 & iris$Sepal.Length >= 4, c("Petal.Width","Sepcies")]
# is.na()와 같은 함수 활용
# 임의로 <NA> 데이터 삽입
test.iris <- iris
test.iris[c(1,5,10), 2] <- NA
test.iris[is.na(test.iris[2]),c(1:5)]
> test.iris[is.na(test.iris[2]),c(1:5)]
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 NA 1.4 0.2 setosa
5 5.0 NA 1.4 0.2 setosa
10 4.9 NA 1.5 0.1 setosa
rainfall <- c(21.6, 23.6, 45.8, 77.0,
102.2, 133.3, 327.9, 348.0,
137.6, 49.3, 53.0, 24.9)
# 100 이상의 값
rainfall[rainfall > 100]
> rainfall[rainfall >100]
[1] 102.2 133.3 327.9 348.0 137.6
which(rainfall>100)
which.max(rainfall)
which.min(rainfall)
#index값인 점 주의
> which(rainfall>100)
[1] 5 6 7 8 9
> which.max(rainfall)
[1] 8
> which.min(rainfall)
[1] 1
#인덱스 값 출력이라는 점 이용
#[] 내에서 활용
#month.name : R 내장함수 _ 당월 이름(영문)
#month.abb : R 내장함수 _ 당월 단축어(영문)
month.name[which(rainfall >100)]
month.abb[which.max(rainfall)]
month.abb[which.min(rainfall)]
> month.name[which(rainfall > 100)]
[1] "May" "June" "July" "August" "September"
> month.abb[which.max(rainfall)]
[1] "Aug"
> month.abb[which.min(rainfall)]
[1] "Jan"
이렇게 []
를 통해서 원하는 데이터를 추출하는 법을 알아보았다.
데이터를 활용하기에 앞서 가장 중요한 것은
원하는 조건에 해당하는 데이터만 뽑아내는
데이터 정제라고 생각한다.
데이터를 나의 목적에 맞게 쓸 수 있게끔
다양한 Method를 자유롭게 다룰 수 있을 때까지 꾸준히 조사해보고 습득해야겠다는 생각이 든다.