2016-04-13 6 views
0

Я изо всех сил стараюсь превратить помеченные переменные в факторы. Набор данных, с которым я работаю, можно получить здесь: [https://www.dropbox.com/s/jhp780hd0ii3dnj/out.sav?dl=0][1]. Это был файл данных spss, который мне нравится использовать из-за того, что используют мои коллеги.Эффективное преобразование помеченных переменных в факторы

Когда я читаю данные, вы можете видеть, что каждый фактор из файла превращается в класс с меткой.

#load libraries 
library(haven) 
library(tidy) 
library(dplyr) 
#Import 
test<-read_sav(path='~/your/path/name/out.sav') 
#Structure 
str(test) 
#Find Class 
sapply(test, class) 

Первая проблема, которая у меня есть, что ggplot2 не знает, как применить шкалу с меченым класса.

# 
td<-ford %>% 
select(income, stress) %>% 
group_by(income, stress)%>% 
filter(is.na(stress)==FALSE)%>% 
filter(is.na(income)==FALSE)%>% 
summarize(Freq=n())%>% 
mutate(Percent=(Freq/sum(Freq))*100) 

#Draw plot 
ggplot(td, aes(x=income, y=Percent, group=stress))+ 
#barplot 
geom_bar(aes(fill=stress), stat='identity') 

Это может быть решено достаточно хорошо, обернув категориальный переменный «доход» в as_factor()

#Draw plot 
ggplot(td, aes(x=as_ford(income), y=Percent, group=stress))+ 
#barplot 
geom_bar(aes(fill=stress), stat='identity') 

Это работает переменная Рона, однако, если я делаю разведочное исследование, я могу делать много сюжетов с большим количеством помеченных переменных. Это поражает меня как довольно много лишнего набора текста.

Эта проблема усиливается с проблемой этого, когда вы собираете много переменных для построения нескольких кросс-таблиц, вы теряете метки значений.

##Visualizations 
test<-ford %>% 
#The first two variables are the grouping, variables for a series of cross tabs 
select(ford, stress,resp_gender, immigrant2, education, property, commute,  cars, religion) %>% 
#Some renamings 
rename(gender=resp_gender, educ=education, immigrant=immigrant2, relig=religion)%>% 
#Melt all variables other than ford and stress 
gather(variable, category, -ford, -stress)%>% 
#Group by all variables 
group_by(variable, category, ford, stress) %>% 
#filter out missings 
filter(is.na(stress)==FALSE&is.na(ford)==FALSE)%>% 
#filter out missings 
filter(is.na(value)==FALSE)%>% 
#summarize 
summarize(freq=n()) 

#Show plots 
ggplot(test, aes(x=as_factor(value), y=freq, group=as_factor(ford)))+geom_bar(stat='identity',position='dodge', aes(fill=as_factor(ford)))+facet_grid(~category, scales='free') 

Итак, теперь все метки значений для переменных, которые были расплавлены, исчезли. Таким образом, единственный способ, который я вижу, чтобы предотвратить это, - это индивидуально использовать as_factor(), чтобы превратить каждую помеченную переменную в фактор с метками значений в качестве уровней факторов. Но, опять же, это много набрав.

Я предполагаю, что мой вопрос заключается в том, как наиболее эффективно иметь дело с маркированным классом, превращая его в факторы, особенно в отношении ggplot2.

+0

является 'labelled' на самом деле класс? Можете ли вы проверить его с помощью 'is.labelled' или что-то в этом роде? Возможно, вы можете просто сделать ford = lapply (ford, function (x) if ("помечено"% in% class (x)) {x = as_factor (x)} return (x)) '. – Gregor

+0

Да, помечен класс, который определяет пакет haven. – spindoctor

+0

Также смотрите 'mutate_if' in from dplyr 0.5 – aosmith

ответ

0

Это было какое-то время, и ответы уже есть в комментариях, но я отправлю ответ, используя dplyr в любом случае.

library(haven) 

# Load Stata file and look at it 
nlsw88 <- read_dta('http://www.stata-press.com/data/r15/nlsw88.dta') 
head(nlsw88) 

Мы видим, что есть некоторые помеченные переменные. Если мы хотим только преобразовать определенные переменные, мы можем использовать mutate_at от dplyr.

# Convert specific variables to factor 
nlsw88 %>% 
    mutate_at(
     vars('race'), 
     funs(as_factor(.)) 
    ) %>% 
    head() 

Наряду Грегора и комментарии aosmith в мы можем преобразовать все меченые переменные, используя функцию mutate_if, тестирование для labelled класса. Это избавит вас от лишнего набора текста.

# Convert all labelled variables to factor 
nlsw88 %>% 
    mutate_if(
     is.labelled, 
     funs(as_factor(.)) 
    ) %>% 
    head() 

Это может быть использован для создания штрих-графики, аналогичные тому, что вы описали (хотя этот конкретный участок может не иметь большого смысла):

nlsw88 %>% 
    select(race, married, collgrad, union) %>% 
    mutate_if(
     is.labelled, 
     funs(as_factor(.)) 
    ) %>% 
    gather(variable, category, -c(race, married)) %>% 
    group_by(race, married, variable, category) %>% 
    summarise(freq = n()) %>% 
    filter(!is.na(category)) %>% 
    ggplot(aes(x = category, y = freq)) + 
    geom_bar(stat = 'identity', aes(fill=race)) + 
    facet_grid(~married)