[R] Indexing 으로 원하는 조건의 값 추출

DongGyu Jung·2021년 9월 13일
0

여러 행과 여러 열로 형성되어 있는 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개로 이루어져 있다.


[]를 사용하면 정말 다양한 방법으로 추출할 수 있다.

  • 특정 행 or 열 만 추출
#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


  • Vector 구조의 데이터에서의 사용
    *임의의 'rainfall' vector 생성
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함수 를 통한 추출
    • 인수 로 입력된 조건에 충족되는 값의 인덱스 값 추출
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를 자유롭게 다룰 수 있을 때까지 꾸준히 조사해보고 습득해야겠다는 생각이 든다.

0개의 댓글