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

R 有效地将标记变量转换为因子,r,ggplot2,dplyr,tidy,r-haven,R,Ggplot2,Dplyr,Tidy,R Haven,我正在努力寻找有效地将带标签的变量转化为因子的方法。我正在使用的数据集可从以下位置获得: [. 这是一个spss数据文件,我喜欢使用它,因为我的同事使用它 当我读入数据时,您可以看到文件中的每一个因子都变成了一个带标签的类 #load libraries library(haven) library(tidy) library(dplyr) #Import test<-read_sav(path='~/your/path/name/out.sav') #Structure str(tes

我正在努力寻找有效地将带标签的变量转化为因子的方法。我正在使用的数据集可从以下位置获得: [. 这是一个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)
#
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')
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。

已经有一段时间了,答案已经在评论中了,但无论如何,我将使用dplyr发布一个答案

根据Gregor和aosmith的注释,我们还可以使用mutate_if函数转换所有标记的变量,测试标记的类。这将为您节省大量额外的输入

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

已经有一段时间了,答案已经在评论中了,但我还是会用dplyr发布答案

根据Gregor和aosmith的注释,我们还可以使用mutate_if函数转换所有标记的变量,测试标记的类。这将为您节省大量额外的输入

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

标签实际上是一个类吗?你能用Is.labeled或类似的东西来测试它吗?也许你可以在%classx{x=as_factorx}中执行ford=lapplyford,functionx iflabeld%returnx.Yes,Labeled是haven包定义的一个类。另请参见mutate_,如果dplyr 0.5中的in被标记为实际的类?您可以用is.labeled或类似的东西来测试它吗?也许您可以在%classx{x=as_factorx}中执行ford=lapplyford,functionx iLabeled%returnx.Yes,Labeled是haven包定义的类。另请参见dplyr 0.5中的mutate_
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)