Эффективное преобразование помеченных переменных в факторы

Я борюсь со способами эффективного превращения помеченных переменных в факторы. Набор данных, с которым я работаю, доступен здесь: [ https://www.dropbox.com/s/jhp780hd0ii3dnj/out.sav?dl=0%5D%5B1%5D. Это был файл данных 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')

Это можно решить довольно просто, обернув категориальную переменную'come 'в as_factor()

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

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

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

##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.

1 ответ

Решение

Прошло много времени, и ответы уже есть в комментариях, но я выложу ответ, используя 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()

Помимо комментариев Грегора и Аосмита, мы также можем преобразовать все помеченные переменные, используя 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)
Другие вопросы по тегам