2. 데이터 프레임 처리 1 (data.frame, stringAsFactors, dplyr패키지, which, subset)

 
 

데이터 프레임 처리

 

 

 

데이터 프레임 생성 1 : 파일에서

 
 
 
 
 
 
fileEncoding = "euc-kr"
setwd("C:/Users/KIIXXI/Documents/khu")
read.csv("test.csv")
 
 
 
A data.frame: 5 × 3
item price sales
<fct> <int> <int>
풍선 100 200
펌프 3000 5
테이프 300 20
플래카드 20000 1
색종이 150 100
 

 

 


 

데이터 프레임 생성2 : data.frame()

 
 
 
 
 
 
x <- c(1,2,3,4,5)
y <- c(10,20,30,40,50)
z <- c("M","M","M","F","F")
d <- data.frame(x,y,z); 
d
# 이렇게 만들수 도 있다.
c <- data.frame(x=c(1,2,3),y=c(10,20,30),z=c("M","M","F")) 
c
 
 
 
A data.frame: 5 × 3
x y z
<dbl> <dbl> <fct>
1 10 M
2 20 M
3 30 M
4 40 F
5 50 F
 
A data.frame: 3 × 3
x y z
<dbl> <dbl> <fct>
1 10 M
2 20 M
3 30 F
 

 

 


 

데이터프레임 주의 사항 : stringAsFactors

 
 
 
 
 
 
id <- c(1,2,3,4,5)
factory <- c("평택지부1","평택지부2","안산지부","인천지부","원주지부")
sales <- c(70,90,80,85,87)
d <- data.frame(id, factory,sales)
d
str(d)
 
 
 
A data.frame: 5 × 3
id factory sales
<dbl> <fct> <dbl>
1 평택지부1 70
2 평택지부2 90
3 안산지부 80
4 인천지부 85
5 원주지부 87
 
'data.frame':	5 obs. of  3 variables:
 $ id     : num  1 2 3 4 5
 $ factory: Factor w/ 5 levels "안산지부","원주지부",..: 4 5 1 3 2
 $ sales  : num  70 90 80 85 87
 
  • 문자형이 factor 형태로 저장되었다.
 

 

 


 

stringAsFactors를 사용

 
 
 
 
 
 
d <- data.frame(id, factory, sales, stringsAsFactors = FALSE); d
str(d) 
 
 
 
A data.frame: 5 × 3
id factory sales
<dbl> <chr> <dbl>
1 평택지부1 70
2 평택지부2 90
3 안산지부 80
4 인천지부 85
5 원주지부 87
 
'data.frame':	5 obs. of  3 variables:
 $ id     : num  1 2 3 4 5
 $ factory: chr  "평택지부1" "평택지부2" "안산지부" "인천지부" ...
 $ sales  : num  70 90 80 85 87
 
  • 문자형이 chr 형태로 저장되었다.

 

 


 

특정 컬럼 데이터 유형 변환

 
 
 
 
 
 
id <- c(1,2,3,4,5)
factory <- c("평택1","평택2","안산","인천","원주")
type <- c("공장","공장","오피스","오피스","오피스")
sales <- c(70,90,80,85,87)
d <- data.frame(id, factory,type,sales,stringAsFactors=FALSE)
str(d)
 
 
 
'data.frame':	5 obs. of  4 variables:
 $ id     : num  1 2 3 4 5
 $ factory: Factor w/ 5 levels "안산","원주",..: 4 5 1 3 2
 $ type   : Factor w/ 2 levels "공장","오피스": 1 1 2 2 2
 $ sales  : num  70 90 80 85 87
 
 
 
 
 
 
d$type <- as.factor(d$type)
str(d)
 
 
 
'data.frame':	5 obs. of  5 variables:
 $ id             : num  1 2 3 4 5
 $ factory        : Factor w/ 5 levels "안산","원주",..: 4 5 1 3 2
 $ type           : Factor w/ 2 levels "공장","오피스": 1 1 2 2 2
 $ sales          : num  70 90 80 85 87
 $ stringAsFactors: logi  FALSE FALSE FALSE FALSE FALSE
 

 

 


 

데이터 프레임 다루기 : 특정 컬럼 선택

 
 
 
 
 
 
id <- 1:7
name <- c("김원경","박찬웅","조해선","김선영","이화영","양영욱","최필선")
gender <- c("F","M","F","F","F","M","M")
sales <- c(1000,2000,1500,2200,1700,2000,2200)
d <-data.frame(id,name,gender,sales,stringsAsFactors = FALSE)
d
 
 
 
A data.frame: 7 × 4
id name gender sales
<int> <chr> <chr> <dbl>
1 김원경 F 1000
2 박찬웅 M 2000
3 조해선 F 1500
4 김선영 F 2200
5 이화영 F 1700
6 양영욱 M 2000
7 최필선 M 2200
 
 
 
 
 
 
d.col <- d$name
d.col
d.col <- d[,2]
d.col
d.col <- d[,"name"]
d.col
 
 
 
  1. '김원경'
  2. '박찬웅'
  3. '조해선'
  4. '김선영'
  5. '이화영'
  6. '양영욱'
  7. '최필선'
 
  1. '김원경'
  2. '박찬웅'
  3. '조해선'
  4. '김선영'
  5. '이화영'
  6. '양영욱'
  7. '최필선'
 
  1. '김원경'
  2. '박찬웅'
  3. '조해선'
  4. '김선영'
  5. '이화영'
  6. '양영욱'
  7. '최필선'
 
  • 같은 결과가 나온다.
  • 벡터가 아닌 데이터 프레임으로 나오게 하려면 dplyr 패키지의 select()함수를 사용한다.
 
 
 
 
 
 
library(dplyr)
d %>% select(name)
 
 
 
A data.frame: 7 × 1
name
<chr>
김원경
박찬웅
조해선
김선영
이화영
양영욱
최필선
 

 

 


 

데이터 프레임 다루기 : 여러 컬럼 선택

 
 
 
 
 
 
d.cols <- d[,c(2,3,4)]
d.cols
d.cols <- d[, 2:4]
d.cols
d.cols <- d[, c("name","gender","sales")]
d.cols
 
 
 
A data.frame: 7 × 3
name gender sales
<chr> <chr> <dbl>
김원경 F 1000
박찬웅 M 2000
조해선 F 1500
김선영 F 2200
이화영 F 1700
양영욱 M 2000
최필선 M 2200
 
A data.frame: 7 × 3
name gender sales
<chr> <chr> <dbl>
김원경 F 1000
박찬웅 M 2000
조해선 F 1500
김선영 F 2200
이화영 F 1700
양영욱 M 2000
최필선 M 2200
 
A data.frame: 7 × 3
name gender sales
<chr> <chr> <dbl>
김원경 F 1000
박찬웅 M 2000
조해선 F 1500
김선영 F 2200
이화영 F 1700
양영욱 M 2000
최필선 M 2200
 
  • 같은 결과가 나온다.
  • dplyr 패키지의 select 함수 사용.
 
 
 
 
 
 
library(dplyr)
d %>% select(name, gender, sales)
 
 
 
A data.frame: 7 × 3
name gender sales
<chr> <chr> <dbl>
김원경 F 1000
박찬웅 M 2000
조해선 F 1500
김선영 F 2200
이화영 F 1700
양영욱 M 2000
최필선 M 2200
 

 

 


 

데이터 프레임 다루기 : 행 및 원소 선택

 
 
 
 
 
 
d.row <- d[2,] # 특정행 선택
d.row
d.element <- d[2,3] # 특정 원소 선택 
d.element
 
 
 
A data.frame: 1 × 4
  id name gender sales
  <int> <chr> <chr> <dbl>
2 2 박찬웅 M 2000
 
'M'
 

 

 


 

데이터 프레임 다루기 : 조건에 맞는 행 선택

 
 
 
 
 
 
d.man <- d[d$gender=="M",]    # gender라는 컬럼이 M 인 레코드들만 가져와라
d.man
d.woman <- d[d$gender=="F",]  # gender라는 컬럼이 F 인 레코드들만 가져와라
d.woman
 
 
 
A data.frame: 3 × 4
  id name gender sales
  <int> <chr> <chr> <dbl>
2 2 박찬웅 M 2000
6 6 양영욱 M 2000
7 7 최필선 M 2200
 
A data.frame: 4 × 4
  id name gender sales
  <int> <chr> <chr> <dbl>
1 1 김원경 F 1000
3 3 조해선 F 1500
4 4 김선영 F 2200
5 5 이화영 F 1700
 

 

 


 

데이터프레임 다루기 : 조건식 활용

 
 
 
 
 
 
d[d$sales>2000,]
d[(d$gender=="F")&(d$sales>2000),] # and
d[(d$gender=="F")|(d$sales>2000),] # or 
 
 
 
A data.frame: 2 × 4
  id name gender sales
  <int> <chr> <chr> <dbl>
4 4 김선영 F 2200
7 7 최필선 M 2200
 
A data.frame: 1 × 4
  id name gender sales
  <int> <chr> <chr> <dbl>
4 4 김선영 F 2200
 
A data.frame: 5 × 4
  id name gender sales
  <int> <chr> <chr> <dbl>
1 1 김원경 F 1000
3 3 조해선 F 1500
4 4 김선영 F 2200
5 5 이화영 F 1700
7 7 최필선 M 2200
 

 

 


 

데이터프레임 다루기 : which

 
 
 
 
 
 
d.man <- d[which(d$gender=="M"),]
d.man
d.woman <- d[which(d$gender=="F"),]
d.woman
 
 
 
A data.frame: 3 × 4
  id name gender sales
  <int> <chr> <chr> <dbl>
2 2 박찬웅 M 2000
6 6 양영욱 M 2000
7 7 최필선 M 2200
 
A data.frame: 4 × 4
  id name gender sales
  <int> <chr> <chr> <dbl>
1 1 김원경 F 1000
3 3 조해선 F 1500
4 4 김선영 F 2200
5 5 이화영 F 1700
 

 

 


 

데이터프레임 다루기 : which 조건식 활용

 
 
 
 
 
 
d[which(d$sales>2000),]
d[which((d$gender=="F")&(d$sales>2000)),]
d[which((d$gender=="F")|(d$sales>2000)),]
 
 
 
A data.frame: 2 × 4
  id name gender sales
  <int> <chr> <chr> <dbl>
4 4 김선영 F 2200
7 7 최필선 M 2200
 
A data.frame: 1 × 4
  id name gender sales
  <int> <chr> <chr> <dbl>
4 4 김선영 F 2200
 
A data.frame: 5 × 4
  id name gender sales
  <int> <chr> <chr> <dbl>
1 1 김원경 F 1000
3 3 조해선 F 1500
4 4 김선영 F 2200
5 5 이화영 F 1700
7 7 최필선 M 2200
 

 

 


 

데이터프레임 다루기 : subset

  • subset()
  • Factor에 대해서도 사용 가능하다.
  • 쉼표 구분하지 않아도 행을 추출한다.
 
 
 
 
 
 
d.man <- subset(d,gender=="M") # gender 컬럼의 내용이 "M"인 행만, 
d.man
subset(d,gender=="F")
d.woman
subset(d,gender=="F",select=c(name,gender))
 
 
 
A data.frame: 3 × 4
  id name gender sales
  <int> <chr> <chr> <dbl>
2 2 박찬웅 M 2000
6 6 양영욱 M 2000
7 7 최필선 M 2200
 
A data.frame: 4 × 4
  id name gender sales
  <int> <chr> <chr> <dbl>
1 1 김원경 F 1000
3 3 조해선 F 1500
4 4 김선영 F 2200
5 5 이화영 F 1700
 
A data.frame: 4 × 4
  id name gender sales
  <int> <chr> <chr> <dbl>
1 1 김원경 F 1000
3 3 조해선 F 1500
4 4 김선영 F 2200
5 5 이화영 F 1700
 
A data.frame: 4 × 2
  name gender
  <chr> <chr>
1 김원경 F
3 조해선 F
4 김선영 F
5 이화영 F
 

 

 


 

데이터 프레임 다루기 : subset 조건식 활용

 
 
 
 
 
 
subset(d, sales>2000)
subset(d, gender == "F" & sales > 2000)
subset(d, gender == "F" | sales > 2000)
 
 
 
A data.frame: 2 × 4
  id name gender sales
  <int> <chr> <chr> <dbl>
4 4 김선영 F 2200
7 7 최필선 M 2200
 
A data.frame: 1 × 4
  id name gender sales
  <int> <chr> <chr> <dbl>
4 4 김선영 F 2200
 
A data.frame: 5 × 4
  id name gender sales
  <int> <chr> <chr> <dbl>
1 1 김원경 F 1000
3 3 조해선 F 1500
4 4 김선영 F 2200
5 5 이화영 F 1700
7 7 최필선 M 2200
 
 
 
 
 
 
subset(d, gender == "F" | sales > 2000, select = c(name,gender))
 
 
 
A data.frame: 5 × 2
  name gender
  <chr> <chr>
1 김원경 F
3 조해선 F
4 김선영 F
5 이화영 F
7 최필선 M
 

 

 


 

데이터 프레임 다루기 : dplyr(%>%)

 
 
 
 
 
 
#install.packages("dplyr")
library(dplyr)
d.man <-d%>% filter(gender == "M")
d.man
d.woman <- d %>% filter(gender == "F")
d.woman
 
 
 
A data.frame: 3 × 4
id name gender sales
<int> <chr> <chr> <dbl>
2 박찬웅 M 2000
6 양영욱 M 2000
7 최필선 M 2200
 
A data.frame: 4 × 4
id name gender sales
<int> <chr> <chr> <dbl>
1 김원경 F 1000
3 조해선 F 1500
4 김선영 F 2200
5 이화영 F 1700
 

 

 


 

데이터 프레임 다루기 : dplyr 조건식 활용

 
 
 
 
 
 
d %>% filter(sales > 2000)
d %>% filter(gender == "F" & sales >2000)
d %>% filter(gender == "F" | sales>2000)
 
 
 
A data.frame: 2 × 4
id name gender sales
<int> <chr> <chr> <dbl>
4 김선영 F 2200
7 최필선 M 2200
 
A data.frame: 1 × 4
id name gender sales
<int> <chr> <chr> <dbl>
4 김선영 F 2200
 
A data.frame: 5 × 4
id name gender sales
<int> <chr> <chr> <dbl>
1 김원경 F 1000
3 조해선 F 1500
4 김선영 F 2200
5 이화영 F 1700
7 최필선 M 2200
 

 

 


 

연습 1

text.csv 파일에서 기본방법과 subset 함수를 이용한 방법을 이용하여 연습하자.

데이터 준비

 
 
 
 
 
 
d<- read.csv("test.csv")
d
 
 
 
A data.frame: 5 × 3
item price sales
<fct> <int> <int>
풍선 100 200
펌프 3000 5
테이프 300 20
플래카드 20000 1
색종이 150 100
 

 

 


 

sales가 5가 넘는 행을 추출

 
 
 
 
 
 
d[(d$sales>5),] 
 
 
 
A data.frame: 3 × 3
  item price sales
  <fct> <int> <int>
1 풍선 100 200
3 테이프 300 20
5 색종이 150 100
 

 

 


 

price가 300 이상이면서 sales가 5이상인 행

 
 
 
 
 
 
d[(d$price>=300 & d$sales>=5),]
 
 
 
A data.frame: 2 × 3
  item price sales
  <fct> <int> <int>
2 펌프 3000 5
3 테이프 300 20
 

 

 


 

subset()함수를 이용하여 item 컬럼만 추출하세요.

 
 
 
 
 
 
c <- d[(d$price>=300 & d$sales>=5),]
c
 
 
 
A data.frame: 2 × 3
  item price sales
  <fct> <int> <int>
2 펌프 3000 5
3 테이프 300 20

댓글

Designed by JB FACTORY