R로 데이터 다루기

R에서 dplyr을 이용해 데이터를 추출, 가공하는 방법을 알아봅니다


수강중

9. 데이터 정렬(arrage) 및 조건에 맞는 데이터 추출(filter)하기

library(dplyr)
sales <- read.csv('sales.csv', stringsAsFactors = F,
                  fileEncoding = 'UTF-8')
colnames(sales) <- c('city', 'district', 'gender', 'sales.nm', 'sales.cd', 'ymd', 'sales.num')

colnames

colnames로 데이터 column 확인하기

colnames(sales)
[1] "city"      "district"  "gender"    "sales.nm"  "sales.cd"  "ymd"      
[7] "sales.num"

판매건수 오름차순 정렬

arrange

sales %>% arrange(sales.num)로 오름차순으로 정렬한다. sales.num(판매건수)가 낮은 순부터 오름차순으로 출력이 된다.

sales %>% arrange(sales.num) %>% head
  city       district gender sales.nm sales.cd ymd      sales.num
1 서울특별시 강남구   여     카페베타 12AA01   20140106 1        
2 서울특별시 강남구   남     카페베타 12AA01   20140106 1        
3 서울특별시 강남구   여     원조백반 100202   20140121 1        
4 서울특별시 강남구   남     원조백반 100202   20140121 1        
5 서울특별시 강남구   여     전주비빔 100203   20140126 1        
6 서울특별시 강남구   남     전주비빔 100203   20140126 1        

판매건수 내림차순 정렬

desc

arrange의 옵션중 desc을 사용한다. desc는 decreasing, 감소하다는 뜻이다. sales.num(판매건수)가 높은 순부터 내림차순으로 출력이 된다.

sales %>% arrange(desc(sales.num)) %>% head
  city       district gender sales.nm sales.cd ymd      sales.num
1 서울특별시 강남구   여     원조한식 100201   20140116 500      
2 서울특별시 강남구   여     스탑버스 12AA02   20140215 500      
3 서울특별시 강남구   남     스탑버스 12AA02   20140215 500      
4 서울특별시 강남구   NA     베타문구 110002   20140411 500      
5 서울특별시 강남구   여     스탑버스 12AA02   20140411 500      
6 서울특별시 강남구   남     베타문구 110002   20140411 500      

데이터 확인하기

head

head를 이용해서 6개만 탐색적으로 데이터를 확인한다.

sales %>% arrange(desc(sales.num)) %>% head
  city       district gender sales.nm sales.cd ymd      sales.num
1 서울특별시 강남구   여     원조한식 100201   20140116 500      
2 서울특별시 강남구   여     스탑버스 12AA02   20140215 500      
3 서울특별시 강남구   남     스탑버스 12AA02   20140215 500      
4 서울특별시 강남구   NA     베타문구 110002   20140411 500      
5 서울특별시 강남구   여     스탑버스 12AA02   20140411 500      
6 서울특별시 강남구   남     베타문구 110002   20140411 500      

slice

slice를 통해 원하는 만큼의 숫자를 뽑아서 볼 수 있다.

head대신 slice(1:1000)를 이용하여 1000개의 데이터를 확인한다.

sales %>% arrange(desc(sales.num)) %>% slice(1:1000)
     city       district gender sales.nm sales.cd ymd      sales.num
1    서울특별시 강남구   여     원조한식 100201   20140116 500      
2    서울특별시 강남구   여     스탑버스 12AA02   20140215 500      
3    서울특별시 강남구   남     스탑버스 12AA02   20140215 500      
4    서울특별시 강남구   NA     베타문구 110002   20140411 500      

판매건수 상위 10개

내림차순 정렬후, slice를 이용해서 1부터 10까지 자른후 새롭게 만든 sales.top10 변수에 저장해서 확인한다.

sales.top10 <- sales %>% arrange(desc(sales.num)) %>% slice(1:10)
sales.top10
   city       district gender sales.nm sales.cd ymd      sales.num
1  서울특별시 강남구   여     원조한식 100201   20140116 500      
2  서울특별시 강남구   여     스탑버스 12AA02   20140215 500      
3  서울특별시 강남구   남     스탑버스 12AA02   20140215 500      
4  서울특별시 강남구   NA     베타문구 110002   20140411 500      
5  서울특별시 강남구   여     스탑버스 12AA02   20140411 500      
6  서울특별시 강남구   남     베타문구 110002   20140411 500      
7  서울특별시 강남구   남     스탑버스 12AA02   20140411 500      
8  서울특별시 강남구   여     원조백반 100202   20140715 500      
9  서울특별시 강남구   남     원조백반 100202   20140715 500      
10 서울특별시 강남구   남     원조백반 100202   20140730 500      

arrange

arrange로 여러 개의 변수를 동시에 정렬하기.

성별, 판매건수 변수 정렬

성별, 판매건수에 대해서 정렬한다. 기존에는 남녀가 섞여있는데, 성별에 대해서 먼저 정렬이되면 한글 순으로 정렬되기 때문에 남자가 여자보다 먼저 정렬이 되어 출력이 된다. 그리고 2차적으로 성별안에서 다시 판매건수를 가지고 오름차순 정렬이 된다.

sales %>% arrange(gender, sales.num) %>% slice(1:10)
   city       district gender sales.nm sales.cd ymd      sales.num
1  서울특별시 강남구   남     카페베타 12AA01   20140106 1        
2  서울특별시 강남구   남     원조백반 100202   20140121 1        
3  서울특별시 강남구   남     전주비빔 100203   20140126 1        
4  서울특별시 강남구   남     원조한식 100201   20140225 1        
5  서울특별시 강남구   남     카페베타 12AA01   20140302 1        
6  서울특별시 강남구   남     키즈랜드 100101   20140307 1        
7  서울특별시 강남구   남     카페베타 12AA01   20140526 1        
8  서울특별시 강남구   남     레스탑   110001   20140804 1        
9  서울특별시 강남구   남     레스탑   110001   20140913 1        
10 서울특별시 강남구   남     전주비빔 100203   20141102 1        

구, 판매건수 변수 정렬

desc(district), desc(sales.num)으로 구와 판매건수를 내림차순으로 정렬한다. 정렬 결과를 확인하면 중랑구부터 정렬이 되고, 2차적으로 구 안에서 판매건수가 높은것부터 낮은순으로 내림차순 정렬이 된다.

sales %>% arrange(desc(district), desc(sales.num)) %>% slice(1:100)
    city       district gender sales.nm sales.cd ymd      sales.num
1   서울특별시 중랑구   여     카페베타 12AA01   20140115 500      
2   서울특별시 중랑구   남     @        @        20140115 500      
3   서울특별시 중랑구   남     원조한식 100201   20140125 500      
4   서울특별시 중랑구   여     원조한식 100201   20140125 500      

select

select 함수를 이용해 변수 선택을 한다.

sales %>% select(ymd) %>% head
  ymd     
1 20140101
2 20140101
3 20140101
4 20140101
5 20140101
6 20140101

seect(-)

select(-ymd)을 이용해 ymd 변수는 제외 선택을 한다.

sales.del <- sales %>% select(-ymd)
sales.del %>% head
  city       district gender sales.nm sales.cd sales.num
1 서울특별시 강남구   남     스탑버스 12AA02   103      
2 서울특별시 강남구   여     키즈랜드 100101   309      
3 서울특별시 강남구   여     키즈랜드 100101   365      
4 서울특별시 강남구   남     스탑버스 12AA02   421      
5 서울특별시 강남구   여     스탑버스 12AA02   413      
6 서울특별시 강남구   남     키즈랜드 100101   428      

조건에 맞는 데이터 추출 다른 예시 - nrow, |, &

& AND 조건을 이용해 성별이 이면서 인 데이터를 뽑는다.

sales %>% filter(gender == '남' & gender =='여')
     city district gender sales.nm sales.cd ymd sales.num

| OR 조건을 이용해 성별이 이거나 인 데이터를 뽑는다. nrowfilter(gender == '남' | gender =='여')에 해당하는 행 개개수를 확인한다.

sales %>% filter(gender == '남' | gender =='여') %>% nrow
[1] 236520

sales전체 데이터 행의 개수를 확인한다. 성별에 NA가 포함되어있기 때문에 남자 또는 여자로 필터한 데이터 행 개수 보다 필터를 안한 전체 행의 개수는 더 많다.

sales %>% nrow
[1] 262800

%in%

특정 값을 가지는 데이터만 뽑고 싶을 때, %in%을 사용한다.

1부터 10을 변수 X에 넣는다.

x = 1:10

x %in% c(5,6,7)의 결과 5,6,7에 해당하는 데이터는 TRUE로 반환해준다.

x %in% c(5,6,7)
 [1] FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE

x %in% c(5,6,7)X[]로 감싸주면 5,6,7이 출력된다.

x[x %in% c(5,6,7)]
[1] 5 6 7

데이터에 적용

sales.nm %in% c('스탑버스', '카페베타')스탑버스카페베타 업종만 뽑는다.

sales %>% filter(sales.nm %in% c('스탑버스', '카페베타')) %>% head
  city       district gender sales.nm sales.cd ymd      sales.num
1 서울특별시 강남구   남     스탑버스 12AA02   20140101 103      
2 서울특별시 강남구   남     스탑버스 12AA02   20140101 421      
3 서울특별시 강남구   여     스탑버스 12AA02   20140101 413      
4 서울특별시 강남구   남     카페베타 12AA01   20140101  88      
5 서울특별시 강남구   여     카페베타 12AA01   20140101 117      
6 서울특별시 강남구   남     스탑버스 12AA02   20140101 267