데이터를 분석할 때 중요한 점은 상상력과 그에 따른 구현능력이라 생각합니다.빅데이터라는 말이 자주 나옵니다. 실제로 약 1000개의 변수 10만개이상의 데이터셋을 받았을 때를 상상해보세요. 데이터 전처리를 어떻게 해나갈수 있을지…. 데이터를 통째로 이용하면 효율성이 떨어질 뿐만 아니라 자료처리에 부담이 커지고 이해하기도 어려울것입니다. 또한 R에서는 속도도 느립니다.. 이럴때 변수 선별은 원하는 변수를 남기고 혹은 필요없는 변수를 버리는 기법입니다. 타이디버스 라이브러리 접근을 사용하면 변수선별을 매우 쉽게 하실수 있습니다. 항상 데이터를 바라볼 때 다양한 상상을 항상 하시길 바랍니다.
library(readxl)
library(tidyverse)
## -- Attaching packages ---------------------------------- tidyverse 1.2.1 --
## √ ggplot2 3.1.0 √ purrr 0.2.5
## √ tibble 1.4.2 √ dplyr 0.7.8
## √ tidyr 0.8.2 √ stringr 1.3.1
## √ readr 1.1.1 √ forcats 0.3.0
## -- Conflicts ------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(haven)
library(ggplot2)
182개의 행과 7개의 변수가 있습니다. 변수의 이름들을 보면 4열 부터 7열까지는 규칙적으로 도서관이라는 이름으로 끝납니다. 변수를 선별해보겠습니다.
seoul_library=read_xls("data_library.xls")
seoul_library
## # A tibble: 182 x 7
## 기간 자치구 계 국립도서관 공공도서관 대학도서관 전문도서관
## <chr> <chr> <dbl> <chr> <dbl> <chr> <chr>
## 1 2010 합계 464 3 101 85 275
## 2 2010 종로구 50 - 4 9 37
## 3 2010 중구 57 - 2 2 53
## 4 2010 용산구 18 - 3 2 13
## 5 2010 성동구 6 - 4 2 -
## 6 2010 광진구 9 - 3 3 3
## 7 2010 동대문구 17 - 2 5 10
## 8 2010 중랑구 4 - 2 1 1
## 9 2010 성북구 16 - 3 8 5
## 10 2010 강북구 10 - 5 3 2
## # ... with 172 more rows
기간,자치구 계 변수들만 설별 select문 안에 따옴표(’’)없이 그냥 변수의 이름만 나열하면 됩니다.
seoul_library2<-seoul_library %>%
select(기간,자치구,계)
seoul_library2
## # A tibble: 182 x 3
## 기간 자치구 계
## <chr> <chr> <dbl>
## 1 2010 합계 464
## 2 2010 종로구 50
## 3 2010 중구 57
## 4 2010 용산구 18
## 5 2010 성동구 6
## 6 2010 광진구 9
## 7 2010 동대문구 17
## 8 2010 중랑구 4
## 9 2010 성북구 16
## 10 2010 강북구 10
## # ... with 172 more rows
변수를 버릴때는 select문 안에 각변수마다 (-)표시를 해주면 됩니다. 또한 R의 결과를 줄이기 위해 print()함수를 이용하겠습니다.
seoul_library2<-seoul_library %>%
select(-국립도서관,-공공도서관,-대학도서관,-전문도서관) %>% print(n=2)
## # A tibble: 182 x 3
## 기간 자치구 계
## <chr> <chr> <dbl>
## 1 2010 합계 464
## 2 2010 종로구 50
## # ... with 180 more rows
특정 표현이 규칙적으로 등장한 경우 만약에 변수이름이 모두 ‘도서관’이라는 데이터로 끝나는 변수들을 삭제하고 싶다며 ’end_with(’도서관’)’을 이용합니다.
seoul_library2=seoul_library %>%
select(-ends_with("도서관")) %>% print(n=2)
## # A tibble: 182 x 3
## 기간 자치구 계
## <chr> <chr> <dbl>
## 1 2010 합계 464
## 2 2010 종로구 50
## # ... with 180 more rows
ends_with()함수가 있으면 starts_with()함수도 있겠죠? 또한 시작과 끝을 말하는 함수 뿐만아니라 contains()함수 역시 있습니다.
seoul_library2=seoul_library %>%
select(기간,자치구,contains("도서")) %>% print(n=2)
## # A tibble: 182 x 6
## 기간 자치구 국립도서관 공공도서관 대학도서관 전문도서관
## <chr> <chr> <chr> <dbl> <chr> <chr>
## 1 2010 합계 3 101 85 275
## 2 2010 종로구 - 4 9 37
## # ... with 180 more rows
또한 연속적으 2열부터 5열까지 뽑아내고싶다 하면 (:)을 사용해주면 됩니다.
seoul_library2=seoul_library %>%
select(기간:공공도서관) %>% print(n=2)
## # A tibble: 182 x 5
## 기간 자치구 계 국립도서관 공공도서관
## <chr> <chr> <dbl> <chr> <dbl>
## 1 2010 합계 464 3 101
## 2 2010 종로구 50 - 4
## # ... with 180 more rows
변수명을 숫자로도 표현해줘도 가능합니다.
seoul_library2=seoul_library %>%
select(2:5) %>% print(n=2)
## # A tibble: 182 x 4
## 자치구 계 국립도서관 공공도서관
## <chr> <dbl> <chr> <dbl>
## 1 합계 464 3 101
## 2 종로구 50 - 4
## # ... with 180 more rows
또한 연속적으 2열부터 5열까지 빼고싶으면 ’-()’하면 됩니다. 여기서 주의할점은 select(-2:5)하면 인식을 못합니다. 왜나하면 -2라는 위치는 존재하지 않기 때문입니다.
seoul_library2=seoul_library %>%
select(-(2:5)) %>% print(n=2)
## # A tibble: 182 x 3
## 기간 대학도서관 전문도서관
## <chr> <chr> <chr>
## 1 2010 85 275
## 2 2010 9 37
## # ... with 180 more rows
data_gss_panel06.dta 데이터 중에서 우리는 2006년에 측정된 변수들을 알아보고싶습니다. “_1" 은 06년도에 “_2“는 2008년도에”_3“은 2010년도에 측정되었고”_숫자“가 없는 변수는 2006년도에 한차례 측정되었습니다. 과연 2006년도에 측정된 변수는 몇개일까요?
gss06<-read_dta("data_gss_panel06.dta")
dim(gss06)#->변수만 1854개임을 알 수 있습니다.
## [1] 2000 1854
gss06<-gss06 %>% select(-contains("_2"),-contains("_3"))
dim(gss06)
## [1] 2000 624
gss06<-read_dta("data_gss_panel06.dta") %>% select(-ends_with("_2"),-ends_with("_3"))
dim(gss06) #'624'개임을 알수 있습니다.
## [1] 2000 624
참고로 contains()함수나 ends_with()함수 안에 두개의 변수를 사용하지 못합니다. 예를들면 contains(“_2“,”_3“)은 논리적인 비약입니다.
gss06변수 이름에서 ’relig’라는 표현이 들어가는 변수만 골라내보자.
gss06 %>% select(contains("relig")) #총 3개가 있음을 알 수있다.
## # A tibble: 2,000 x 3
## relig_1 relig16_1 screlig_1
## <dbl+lbl> <dbl+lbl> <dbl+lbl>
## 1 4 2 " 5"
## 2 4 2 NA
## 3 1 1 " 2"
## 4 2 2 NA
## 5 6 6 NA
## 6 2 2 NA
## 7 3 3 " 1"
## 8 1 1 NA
## 9 1 1 NA
## 10 2 2 NA
## # ... with 1,990 more rows
“data_TESS3_131.sav”데이터 중에서 “PP”라는 표현으로 시작하는 변수들을 선별하세요
data_131<-read_spss("data_TESS3_131.sav") %>% select(starts_with("PP"))
data_131 #24개
## # A tibble: 593 x 24
## PPAGE ppagecat ppagect4 PPEDUC PPEDUCAT PPETHM PPGENDER PPHHHEAD
## <dbl> <dbl+lb> <dbl+lb> <dbl+> <dbl+lb> <dbl+> <dbl+lb> <dbl+lb>
## 1 29 2 1 12 4 1 1 0
## 2 53 4 3 " 9" 2 1 2 1
## 3 58 5 3 10 3 4 1 1
## 4 18 1 1 " 7" 1 4 2 1
## 5 19 1 1 10 3 1 2 0
## 6 52 4 3 10 3 4 1 1
## 7 44 3 2 12 4 1 1 1
## 8 53 4 3 13 4 1 1 1
## 9 31 2 2 " 5" 1 4 1 0
## 10 60 5 4 12 4 1 2 1
## # ... with 583 more rows, and 16 more variables: PPHHSIZE <dbl+lbl>,
## # PPHOUSE <dbl+lbl>, PPINCIMP <dbl+lbl>, PPMARIT <dbl+lbl>,
## # PPMSACAT <dbl+lbl>, PPREG4 <dbl+lbl>, ppreg9 <dbl+lbl>,
## # PPRENT <dbl+lbl>, PPSTATEN <dbl+lbl>, PPT01 <dbl+lbl>,
## # PPT25 <dbl+lbl>, PPT612 <dbl+lbl>, PPT1317 <dbl+lbl>,
## # PPT18OV <dbl+lbl>, PPWORK <dbl+lbl>, PPNET <dbl+lbl>
3.상상해보기에서 얻은 data_131의 경우 알파벳 대.소문자를 구별하지 않습니다. 대문자만 포함하는 함수를 구하세요
data_131 = read_spss("data_TESS3_131.sav") %>%
select(starts_with("PP", ignore.case = FALSE)) #ignore.case는 default가 TRUE인데 FALSE할 경우 앞과 똑같이 매칭되는 문자만 선별합니다.
data_131 #21개
## # A tibble: 593 x 21
## PPAGE PPEDUC PPEDUCAT PPETHM PPGENDER PPHHHEAD PPHHSIZE PPHOUSE PPINCIMP
## <dbl> <dbl+> <dbl+lb> <dbl+> <dbl+lb> <dbl+lb> <dbl+lb> <dbl+l> <dbl+lb>
## 1 29 12 4 1 1 0 4 1 19
## 2 53 " 9" 2 1 2 1 3 1 15
## 3 58 10 3 4 1 1 2 1 14
## 4 18 " 7" 1 4 2 1 3 1 14
## 5 19 10 3 1 2 0 4 1 17
## 6 52 10 3 4 1 1 4 1 " 7"
## 7 44 12 4 1 1 1 4 1 11
## 8 53 13 4 1 1 1 4 1 16
## 9 31 " 5" 1 4 1 0 5 3 " 6"
## 10 60 12 4 1 2 1 2 1 16
## # ... with 583 more rows, and 12 more variables: PPMARIT <dbl+lbl>,
## # PPMSACAT <dbl+lbl>, PPREG4 <dbl+lbl>, PPRENT <dbl+lbl>,
## # PPSTATEN <dbl+lbl>, PPT01 <dbl+lbl>, PPT25 <dbl+lbl>,
## # PPT612 <dbl+lbl>, PPT1317 <dbl+lbl>, PPT18OV <dbl+lbl>,
## # PPWORK <dbl+lbl>, PPNET <dbl+lbl>
data_TESS3_131.sav 데이터 중에서 “_“라는 표현이 포함된 변수들을 선별한 후 다시 data_131로 저장하세요
data_131<-read_spss("data_TESS3_131.sav") %>% select(contains("_"))
data_131 #총 42개
## # A tibble: 593 x 42
## tm_start tm_finish STUDY1_ASSIGN STUDY2_ASSIGN
## <dttm> <dttm> <dbl+lbl> <dbl+lbl>
## 1 2013-02-07 22:13:21 2013-02-07 22:16:30 1 5
## 2 2013-02-07 22:15:13 2013-02-07 22:22:52 2 1
## 3 2013-02-07 22:16:00 2013-02-07 22:20:32 1 1
## 4 2013-02-07 22:16:12 2013-02-11 00:07:13 2 2
## 5 2013-02-07 22:17:10 2013-02-07 22:24:10 1 5
## 6 2013-02-07 22:18:27 2013-02-07 22:24:06 1 5
## 7 2013-02-07 22:18:27 2013-02-07 22:26:15 2 3
## 8 2013-02-07 22:18:57 2013-02-07 22:24:34 2 1
## 9 2013-02-07 22:20:00 2013-02-07 22:44:32 2 2
## 10 2013-02-07 22:20:26 2013-02-07 22:25:53 2 3
## # ... with 583 more rows, and 38 more variables: STUDY3_ASSIGN <dbl+lbl>,
## # CONSENT_t <dbl>, Q1_t <dbl>, DISPLAY_STUDY1_ASSIGN1_t <dbl>,
## # DISPLAY_STUDY1_ASSIGN2_t <dbl>, Q2_t <dbl>, Q3_t <dbl>, Q4_t <dbl>,
## # Q5_t <dbl>, DISPLAY_STUDY2_ASSIGN1_t <dbl>,
## # DISPLAY_STUDY2_ASSIGN2_t <dbl>, DISPLAY_STUDY2_ASSIGN3_t <dbl>,
## # DISPLAY_STUDY2_ASSIGN4_t <dbl>, DISPLAY_STUDY2_ASSIGN5_t <dbl>,
## # Q6_t <dbl>, Q7_t <dbl>, Q8_t <dbl>, Q9_t <dbl>,
## # DISPLAY_STUDY3_ASSIGN1_t <dbl>, DISPLAY_STUDY3_ASSIGN2_t <dbl>,
## # DISPLAY_STUDY3_ASSIGN3_t <dbl>, DISPLAY_STUDY3_ASSIGN4_t <dbl>,
## # Q10_t <dbl>, Q11_t <dbl>, Q12_t <dbl>, Q13_t <dbl>, Q14_Q18_t <dbl>,
## # Q19_t <dbl>, Q20_t <dbl>, Q21_t <dbl>,
## # DISPLAY_STUDY3_ASSIGN13_t <dbl>, PARTY1_t <dbl>, PARTY2_t <dbl>,
## # PARTY3_t <dbl>, PARTY4_t <dbl>, IDEO_t <dbl>, REL1_t <dbl>,
## # REL2_t <dbl>
filter문은 설정된 조건에 맞게 걸러내는 역활을 합니다. 예를 들면 여성 응답자만 알고싶다. 혹은 특정 변수의 결측치를 제거하고 싶다. 할때 이용합니다. 실제로 정말 많이 사용되니까 하나하나씩 곰곰이 생각해보시길 바랍니다.
data_131 = read_spss("data_TESS3_131.sav") %>%
select(starts_with("PP",ignore.case=FALSE)) %>% print(n=2)
## # A tibble: 593 x 21
## PPAGE PPEDUC PPEDUCAT PPETHM PPGENDER PPHHHEAD PPHHSIZE PPHOUSE PPINCIMP
## <dbl> <dbl+> <dbl+lb> <dbl+> <dbl+lb> <dbl+lb> <dbl+lb> <dbl+l> <dbl+lb>
## 1 29 12 4 1 1 0 4 1 19
## 2 53 " 9" 2 1 2 1 3 1 15
## # ... with 591 more rows, and 12 more variables: PPMARIT <dbl+lbl>,
## # PPMSACAT <dbl+lbl>, PPREG4 <dbl+lbl>, PPRENT <dbl+lbl>,
## # PPSTATEN <dbl+lbl>, PPT01 <dbl+lbl>, PPT25 <dbl+lbl>,
## # PPT612 <dbl+lbl>, PPT1317 <dbl+lbl>, PPT18OV <dbl+lbl>,
## # PPWORK <dbl+lbl>, PPNET <dbl+lbl>
PPGENDER의 빈도표는?
data_131 %>% count(PPGENDER) #남성은 1 여성은 2입니다
## # A tibble: 2 x 2
## PPGENDER n
## <dbl+lbl> <int>
## 1 1 290
## 2 2 303
여기서 여성 응답자만 추려 낸다면?
data_131 %>% filter(PPGENDER==2) %>% count(PPGENDER)
## Warning: package 'bindrcpp' was built under R version 3.4.4
## # A tibble: 1 x 2
## PPGENDER n
## <dbl+lbl> <int>
## 1 2 303
라벨이 붙은 변수의 경우 라벨의 뜻이 궁금하다면 print_labels()함수를 이용해서 무슨 뜻인지 볼 수가있다. 아래에서 1은 Male 2는Female 등 뜻을 볼 수 있을것이다. 특히 이 함수는 spss프로그램을 볼때 유용하게 쓰일 것이다.
print_labels(data_131$PPGENDER)
##
## Labels:
## value label
## -2 Not asked
## -1 REFUSED
## 1 Male
## 2 Female
현재 PPGENDER변수의 경우
data_131 %>% filter(PPGENDER!=2) %>% count(as_factor(PPGENDER)) #-><fct>로 바뀐 모습을 볼 수 있다.
## # A tibble: 1 x 2
## `as_factor(PPGENDER)` n
## <fct> <int>
## 1 Male 290
PPREG4 변수는 응답자가 거주하는 주 에대해 답변한 변수이다. 먼저 print_labels()함수를 이용해 변수의 응답내용을 보겠다.
print_labels(data_131$PPREG4)
##
## Labels:
## value label
## 1 Northeast
## 2 Midwest
## 3 South
## 4 West
우리는 여기서 북동부 중서부 서부 사는 사람만 보고 싶다면 or함수를 이용하면 된다. r에서는 ’|’이 것을 쓰면 된다.
data_131 %>% filter(PPREG4==1 |PPREG4==2 |PPREG4==3) %>% count(as_factor(PPREG4))
## # A tibble: 3 x 2
## `as_factor(PPREG4)` n
## <fct> <int>
## 1 Northeast 116
## 2 Midwest 140
## 3 South 192
이런 경우 부등호를 이용하면 편하다.
data_131 %>% filter(PPREG4<=3) %>% count(as_factor(PPREG4))
## # A tibble: 3 x 2
## `as_factor(PPREG4)` n
## <fct> <int>
## 1 Northeast 116
## 2 Midwest 140
## 3 South 192
이번엔 and 조건문을 이용해보겠습니다. and의 뜻은 동시에 충족해야한다는 뜻입니다. 위에 or는 ’+’개념을 생각하면 쉽습니다. 다 나옵니다.
data_131 %>% filter(PPREG4!=3 & PPGENDER==1) %>%
#filter(PPREG4!=3 , PPGENDER==1) # ','로 써도 같은 내용이 나옵니다.
count(as_factor(PPGENDER),as_factor(PPREG4))
## # A tibble: 3 x 3
## `as_factor(PPGENDER)` `as_factor(PPREG4)` n
## <fct> <fct> <int>
## 1 Male Northeast 55
## 2 Male Midwest 71
## 3 Male West 67
이제 응용해보겠습니다. 1. data_TESS3_131.sav 데이터 불러오기 2. PPGENDER,PPAGE,PARTY7로 시작하는 변수 불러오기 (PARTY7변수는 당파성 변수이고 PPAGE는 응답자의 연령을 나타냅니다.) 3. 40~59세의 남성 응답자 선별한 후 티블 데이터로 저장 4. 이렇게 얻은 데이터에서 PARTY7변수의 분포 확인
read_spss("data_TESS3_131.sav") %>%
select(PPGENDER,PPAGE,PARTY7) %>%
filter(PPGENDER==1 & (PPAGE>=40 & PPAGE<=59)) %>%
count(as_factor(PARTY7))
## # A tibble: 7 x 2
## `as_factor(PARTY7)` n
## <fct> <int>
## 1 Strong Republican 19
## 2 Not Strong Republican 23
## 3 Leans Republican 19
## 4 Undecided/Independent/Other 4
## 5 Leans Democrat 15
## 6 Not Strong Democrat 19
## 7 Strong Democrat 11
이제 결측값을 분석에서 제거하는 리스트단위 제거법을 이용해보겠다. 변수의 결측값을 확인하는 함수는 is.na()함수입니다. ->na(결측값)가 있니?? 이런 의미 입니다. 반환되는 값은 TRUE 혹은 FALSE입니다. 결측값이 있으면 FALSE로 나타납니다.
mygss=read_dta("data_gss_panel06.dta") %>%
select(starts_with("astrolgy_"))
read_dta("data_gss_panel06.dta") %>%
select(starts_with("astrolgy_")) %>%
count(as_factor(astrolgy_3))
## # A tibble: 3 x 2
## `as_factor(astrolgy_3)` n
## <fct> <int>
## 1 yes 179
## 2 no 151
## 3 <NA> 1670
#결측값이 1670개가 있음을 확인 할 수 있습니다.
기본 베이스 r에서 결측값이 몇개 있는지 알고싶습니다.
table(is.na(mygss$astrolgy_3))
##
## FALSE TRUE
## 330 1670
혹은 각 열마다 결측치가 몇개 있는지 알고싶습니다. 이 방법들은 상당히 유용하게 많이 쓰입니다. 외워도 무방할정도 입니다.
colSums(is.na(mygss))
## astrolgy_1 astrolgy_2 astrolgy_3
## 756 1486 1670
위에서 언급한 리스트단위 제거는 데이터 전체에서 단 하나의 변수에서 결측값이 존재하는 사례를 제거하는 방식입니다.
mygss %>% filter(!is.na(astrolgy_1)& !is.na(astrolgy_2)& !is.na(astrolgy_3)) %>% print(n=2)
## # A tibble: 155 x 3
## astrolgy_1 astrolgy_2 astrolgy_3
## <dbl+lbl> <dbl+lbl> <dbl+lbl>
## 1 1 2 1
## 2 1 1 2
## # ... with 153 more rows
동시에 다 제거하니까 153개의 행만 존재하게 됩니다. 사회과학 데이터는 결측치가 상당히 많이 존재합니다. 이렇게 리스트 단위제거는 drop_na함수를 이용하면 편리합니다. 바로 위의 결과와 동일합니다.
mygss %>% drop_na() %>% print(n=2)
## # A tibble: 155 x 3
## astrolgy_1 astrolgy_2 astrolgy_3
## <dbl+lbl> <dbl+lbl> <dbl+lbl>
## 1 1 2 1
## 2 1 1 2
## # ... with 153 more rows
첫번째 data_library.xls데이터 불러오기 두번째 기간,자치구 “도서관”으로 끝내는 이름을 갖는 변수들 불러오기 세번째 2016년도 자료에서 서울시의 25개구 합계를 나타내는 사례(즉 자치구 변수가 “합계”인 경우)는 제외하여 case_Q1이라는 이름의 티블오브젝트로 저장해보세요
case_Q1=read_xls("data_library.xls") %>% select(기간,자치구,ends_with("도서관")) %>%
filter(기간==2016 & 자치구 !="합계")
‘data_library.xls’ 데이터에서 서울시의 25개구 합계를 나타내는 사례들만 남긴후 연도에 따라 공공도서관의 수가 어떻게 변화하고 있는지 쉽게 설명하세요 항상 필요한 변수는 어떤 것일까 그리고 어떤 조건을 원하는지 생각해봐야 됩니다.
graph<-read_xls("data_library.xls") %>% select(기간,자치구,공공도서관) %>%
filter(자치구=='합계')
graph
## # A tibble: 7 x 3
## 기간 자치구 공공도서관
## <chr> <chr> <dbl>
## 1 2010 합계 101
## 2 2011 합계 109
## 3 2012 합계 116
## 4 2013 합계 123
## 5 2014 합계 132
## 6 2015 합계 146
## 7 2016 합계 147
간단하게 그래프도 그려보겠습니다. 우선 as.integer()함수는 정수로 만드는것입니다. 그래야 선을 그을 수가 있습니다. alpha는 선의 색을 연하게 해주는 옵션입니다. 또한 “coord_cartesian”은 범위를 확대해주는 함수입니다. 85에서 155 사이의 범위로 지정해 범위를 확대해주는 함수입니다.
graph %>% ggplot(aes(x=as.integer(기간),y=공공도서관)) +
geom_point(size=5,color="skyblue")+
geom_line(size=2,color='red',alpha=.3)+
coord_cartesian(ylim=c(85,155))+xlab("기간")+
theme_light()
caseQ3= read_dta(“data_gss_panel06.dta”) %>% select(starts_with(“letin1_”))라는 객체가 있습니다. 세 문제에 대해 응답하는 것입니다. 첫번째 2006년 설문에는 응했지만 이후 설문에는 한번 혹은 두번 응하지 않은 응답자는 몇명인가요? 즉 쉽게 설명하면 letin1_1에는 응답하고 나머지 변수에대해서 한번만 혹은 응답한 사람을 찾는것입니다. 두번째 세 설문시점 모두에서 동일한 응답을 한 응답자는 몇 명인가요? 세번째 세 설문시점 중 어느 한 쌍도 동일한 응답을 보이지 않은 응답자는 몇명인가요? 각 변수는 06 08 10년도에 응답한 설문입니다.
caseQ3= read_dta("data_gss_panel06.dta") %>% select(starts_with("letin1_"))
caseQ3 %>% filter(!is.na(letin1_1) & (is.na(letin1_2)|is.na(letin1_3))) %>% print(n=20)
## # A tibble: 498 x 3
## letin1_1 letin1_2 letin1_3
## <dbl+lbl> <dbl+lbl> <dbl+lbl>
## 1 3 NA NA
## 2 5 NA NA
## 3 3 NA NA
## 4 3 " 3" NA
## 5 1 NA NA
## 6 3 NA NA
## 7 3 " 3" NA
## 8 5 " 3" NA
## 9 3 " 3" NA
## 10 4 NA NA
## 11 2 " 2" NA
## 12 2 NA NA
## 13 4 NA NA
## 14 2 NA NA
## 15 2 NA NA
## 16 3 " 3" NA
## 17 5 " 4" NA
## 18 3 NA NA
## 19 3 " 5" NA
## 20 5 NA NA
## # ... with 478 more rows
caseQ3 %>% filter(letin1_1==letin1_2, letin1_1==letin1_3,letin1_2==letin1_3)
## # A tibble: 254 x 3
## letin1_1 letin1_2 letin1_3
## <dbl+lbl> <dbl+lbl> <dbl+lbl>
## 1 3 3 3
## 2 5 5 5
## 3 4 4 4
## 4 2 2 2
## 5 3 3 3
## 6 5 5 5
## 7 3 3 3
## 8 5 5 5
## 9 5 5 5
## 10 4 4 4
## # ... with 244 more rows
caseQ3 %>% filter(letin1_1!=letin1_2,letin1_1!=letin1_3,letin1_2!=letin1_3)
## # A tibble: 105 x 3
## letin1_1 letin1_2 letin1_3
## <dbl+lbl> <dbl+lbl> <dbl+lbl>
## 1 3 2 4
## 2 5 3 4
## 3 4 3 5
## 4 3 5 2
## 5 4 3 2
## 6 5 4 1
## 7 5 3 4
## 8 4 3 2
## 9 5 4 3
## 10 3 2 4
## # ... with 95 more rows