IT Log

R 데이터 전처리 본문

R

R 데이터 전처리

newly0513 2019. 4. 30. 11:26
728x90
반응형
  • dplyr
    • mutate
    • select
    • filter
    • summarise
    • arrange
  • 결측치
    • is.na
    • na.omit
    • na.rm
    • 결측치 대체하기
  • 이상치 제거하기

 

 

 

dplyr

함수 기능
filter() 행 추출
select() 열 추출
arrange() 정렬
mutate() 변수 추가
summarise() 통계치 산출
group_by() 집단별로 나누기
left_join 데이터 합치기(열)
bind_rows() 데이터 합치기(행)

 

filter

starwars%>%
  filter(species=="Droid")

filter는 조건과 일치하는 행을 추출합니다.  species열에서 Droid인 행만 추출합니다.

 

select

starwars%>%
  select(name, ends_with("color"))

select는 조건과 일치하는 열을 추출합니다. name열과 color로 끝나는 열을 추출합니다.

 

 

mutate

starwars%>%
  mutate(name, bmi = mass / (height/100)^2) %>%
  select(name:mass, bmi)

mutate는 새로운 변수를 추가할 수 있습니다. 기존 변수는 그대로 유지됩니다. mutate구문에서 name은 아무런 수식입력이 없기때문에 기존에 있던 name을 그대로 출력합니다. name:mass는 name부터 mass까지 연속적으로 변수를 선택합니다.

 

 

arrange

starwars%>%
  arrange(desc(mass))

arrange는 변수를 정렬합니다. desc(mass)는 mass를 기준으로 내림차순으로 정렬합니다.

 

 

summarise

starwars%>%
  group_by(species)%>%
  summarise(
    n=n(),
    mass=mean(mass, na.rm = TRUE)
  )%>%
  filter(n>1)

summarise는 여러 값을 하나로 요약해주니다. 우선 group_by는 묶어주는 역할로 species를 기준으로 group을 지어줍니다. 그리고 n=n()은 n이라는 열을 생성하고 group별 수를 나타냅니다. 그 다음은 mass라는 열은 mass열이 그룹지어진 평균을 나타내는데 na.rm=TRUE에 의해서 NA, 즉 결측치를 제외하고 평균을 구합니다. 그리고 마지막으로 n이 1보다 큰 행들만 추출해 내면 위에서 보는 결과가 나옵니다.

 

 

 

결측치

test=starwars%>%
  select(hair_color, gender)%>%
  head(20)
test

위에서 활용한 starwars 데이터셋을 이용하여 결측치에 사용할 test변수를 생성했습니다.

 

 

 

is.na

is.na(test)

구성해놓은 test를 is.na를 해본결과 위와 같다. FALSE는 결측치가 아니다를 나타내고 TRUE는 NA, 즉 결측치라는 것을 나타냅니다. 

 

 

 

table(is.na(test))

위에서 작성한 코드를 table을 씌워서 실행하면 FALSE와 TRUE의 수를 집계해서 보여줍니다. !is.na를 하면 TRUE와 FALSE의 결과 반대로 보여줍니다.

 

 

 

na.omit

na.omit(test)

na.omit을 하게되면 화면과 같이 NA가 포함된 행 자체가 제거됩니다. 하지만 이 방법은 NA가 있는 열뿐만이 아니라 다른 열에 있는 변수까지 없어지므로 잘 사용해야 합니다. 

 

 

 

na.rm

mean(test$birth_year)
mean(test$birth_year, na.rm = T)

평균을 추출하는 mean을 구하려는 열에 NA값이 포함이 되어 있는 경우 화면과 같이 결과가 NA로 나오게 됩니다. 그래서 na.rm=T라는 조건을 걸어주면 결측치NA를 제외하고 계산을 해서 제대로된 결과를 출력해 줍니다. 단 모든 함수에서 실행되는 조건이 아니고 몇몇 함수에 한해서 가능합니다. 

 

 

 

결측치 대체하기

birth_year=ifelse(is.na(test$birth_year), 10, test$birth_year)
gender=ifelse(is.na(test$gender),'both', test$gender)
birth_year
gender

이상치 제거하기

boxplot(mpg$hwy)

boxplot(mpg$hwy)$stats

# boxplot 통계치
     [,1]
[1,]   12
[2,]   18
[3,]   24
[4,]   27
[5,]   37
attr(,"class")
        1 
"integer" 
최저 극단치가 12, 최대 극단치가 37로 이 범위를 벗어나면 극단치로 분류
table(is.na(mpg$hwy))

nn_hwy=ifelse(mpg$hwy<12 | mpg$hwy>37, NA, mpg$hwy)
table(is.na(nn_hwy))

# 결측치 처리된 것을 알 수 있다.

 

 

참고 : https://www.rdocumentation.org/packages/dplyr/versions/0.7.8
728x90
반응형

'R' 카테고리의 다른 글

SPC - Control Chart  (0) 2019.05.10
상관분석  (0) 2019.04.30
비율검정  (0) 2019.04.30
이항분포  (0) 2019.04.29
정규분포  (0) 2019.04.29
Comments