有效地将标记变量转换为因子

时间:2016-04-13 16:08:58

标签: r ggplot2 dplyr tidy r-haven

我正在努力将有效地将标记变量转化为因子的方法。我正在使用的数据集可从此处获得: [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')

通过包含分类变量&#39;收入&#39;可以很好地解决这个问题。在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。

1 个答案:

答案 0 :(得分:1)

已经有一段时间了,评论中的答案已经存在,但我仍会使用let color = UIColor(hex: "FF0000") 发布答案。

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

根据Gregor&aosmith的评论,我们还可以使用# 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()