R 열 추출 - R yeol chuchul

- 데이터 추출하기

: 데이터를 확인했다면, 데이터에서 하위구조 데이터를 추출하면서 분석의 기반을 다지는 것.

1. '$' 연산자를 사용한 하위구조 데이터 추출

ex) aws$TA

: aws라는 데이터프레임 객체의 TA라는 열 리턴

2. 벡터 연산을 사용한 하위 구조 데이터 추출

1) 행 추출

① 단일 숫자

ex) aws[2, ]

 aws의 2번째 행 추출해서 리턴. 뒤에 column자리는 비워놓음으로써 2번째 행의 모든 열을 다 리턴.

② 문자

ex) aws["2", ]

 aws의 2번째 행 추출해서 리턴. 혹은 행 이름을 문자로 지정했을 경우에 사용.

③ 연속

ex) aws[3:10, ]

→ 3행부터 10행까지 추출해서 리턴

④ 이산

ex) aws[c(2,135, 3:10), ]

 2행, 135행, 3부터 10행까지 추출해서 리턴. 전달된 인자 순서대로 추출됨. 알아서 정렬 이런 거 없음.

2) 열 추출

① 단일 숫자

ex) aws[ ,3]

 aws의 3번째 열 추출. 앞에 row 자리는 비워놓음으로써 3번째 열의 모든 행을 다 리턴.

② 문자

ex) aws[, "wind" ]

 wind 열(변수)만 리턴

③ 복수 문자

ex) aws[ , c("AWS_ID", "TA")]

 'AWS_ID', 'TA'열 리턴

 연속

ex) aws[ , 3:4 ]

→ 3열부터 4열까지 리턴

⑤ 이산

ex) aws[ ,c(1,3) ]

 1열부터 3열까지 리턴

3) 행, 열 추출

ex) aws[1,3]  # 숫자 인자 전달

aws["1", "TA"] # 문자 인자 전달

aws[2:5, c("TA", "Wind")] # 복수의 행, 열 추출

* 조건연산자 (논리연산자로 조건문처럼 사용 가능)

데이터 추출할 때 굉장히 편하게 쓰일 듯하다. 내가 if문과 for loop을 사용하지 않고 한 줄의 코딩으로 뽑아낼 수 있는 것! 행 자리에 조건문이 들어간다. 즉, row에 대한 연산이 이루어지는 것임을 알 수 있다.

ex) df_1[df_1$$b >= 3, ]

df_1[df_1$aa == "b", ]

df_1[(df_1$bb > 1 && df_1$bb < 4), ]

이들은 해당 조건문에 참인 행을 출력한다. 

** 마이너스 부호 활용시 특정 행 or 열을 제외한 데이터 추출 가능.

- 데이터 치환 및 삽입

1. 벡터 연산을 사용한 데이터 치환 (이라 쓰고 변경이라 읽는다)

aws[row, col] <- value

- 데이터 치환 및 삽입

1. 벡터 연산을 사용한 데이터 치환 (이라 쓰고 변경이라 읽는다)

aws[row, col] <- value

2. 벡터 연산을 사용한 데이터 삽입

기존에 없었던 열이나 행을 명시해주면서 값을 할당시켜주면 됨.

ex) aws[, ncol(aws) + 1] <- "new" (하나만 명시해줘도 칼럼 전체에 new가 다 assign됨)

aws[, "last_one"] <- c(1,2,3,4,5) (새로운 column name을 인덱스에 전달해줘도 데이터 삽입 ok)

여러 행과 여러 열로 형성되어 있는 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를 자유롭게 다룰 수 있을 때까지 꾸준히 조사해보고 습득해야겠다는 생각이 든다.