2016-04-13 11 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標識クラスにスケールを適用する方法を知らないということです。私は探索研究をやっている場合は、しかし、RONE変数の作品カテゴリ変数as_factorの「収益」()

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

をラップすることにより、非常にうまく解決することができる

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

、私はかもしれません多くのラベル付き変数を使ってたくさんのプロットをしています。それはかなりの余分なタイピングとして私を襲う。

この問題は、いくつかのクロス集計をプロットするために多くの変数を収集すると、値ラベルが失われるという問題が拡大します。

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

これで、変数の値ラベルがすべて消滅しました。ですから、これを防ぐための唯一の方法は、各ラベル付き変数をfactorラベルとして値ラベルを持つファクタに変換するためにas_factor()を個別に使用することです。しかし、もう一度、それは多くのタイピングです。

私は、ラベルされたクラスを最も効率的に処理して、それらを要因に変え、具体的にはggplot2に関してどのように扱うべきかと思います。

+0

が実際に 'labelled'クラスです:

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

この

は、(この特定のプロットはあまり意味がないかもしれませんが)あなたが説明したものと同様のバープロットを作成するために使用することができますか?あなたは 'is.labelled'なんかそれでテストすることができますか?たぶん 'ford = lapply(ford、function(x)if("%in%class(x)){x = as_factor(x)} return(x)) 'を実行するだけかもしれません。 – Gregor

+0

はい、ヘイブンパッケージが定義するクラスです。 – spindoctor

+0

dplyr 0.5の 'mutate_if'も参照してください。 – 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) 

ラベル付き変数があることがわかります。特定の変数のみを変換したい場合は、dplyrからmutate_atを使用できます。グレゴールさんとaosmithのコメント沿い

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

我々はまた、labelledクラスのテスト、mutate_if機能を使用して、すべてのラベルの変数を変換することができます。これにより余分なタイピングが大幅に削減されます。

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) 
関連する問題