2017-11-25 18 views
1

私は、before_weight、after_weight、before_pain、およびafter_painの4つの3レベルカテゴリ変数を持つデータフレームを持っています。は、ggplot2()の因子レベルでグループ化されています。

私は変数の各レベルの割合を特徴とする棒グラフを作りたいと思います。私の現在のコードが達成されたこと。

問題はデータの表示です。 before_weight変数で1と答えた人を表すバーが、after_weight変数で1に答えた人を表すバーの隣にグループ化されるように、それぞれ前後のバーをグループ化することができます。体重と痛みの両方の変数。

多くのifelse()ステートメントでdplyr、mutate()を使用して、問題のグループをペアにする新しい変数を作成しようとしましたが、動作させられないようです。

ご協力いただければ幸いです。

出発点(DF):

df <- data.frame(before_weight=c(1,2,3,2,1),before_pain=c(2,2,1,3,1),after_weight=c(1,3,3,2,3),after_pain=c(1,1,2,3,1)) 

現在のコード:

library(tidyr) 
dflong <- gather(df, varname, score, before_weight:after_pain, factor_key=TRUE) 
df$score<- as.factor(df$score) 
library(ggplot2) 
library(dplyr) 
dflong %>% 
    group_by(varname) %>% 
    count(score) %>% 
    mutate(prop = 100*(n/sum(n))) %>% 
    ggplot(aes(x = varname, y = prop, fill = factor(score))) + scale_fill_brewer() + geom_col(position = 'dodge', colour = 'black') 

UPDATE:

私はむしろ数よりも割合が欲しいので、私がしようとしてきましたネイトのコードを微調整する。割合変数を得るために質問変数を使用してデータをグループ化しているので、その変数の内容を変更するためにgsub()を使用することはできません。代わりにquestion2を追加し、それをfacet_wrap()に渡しました。それは動作するようです。:

df %>% gather("question", "val") %>% 
    count(question, val) %>% 
    group_by(question) %>% 
    mutate(percent = 100*(n/sum(n))) %>% 
    mutate(time= factor(ifelse(grepl("before", question), "before", "after"), c("before", "after"))) %>% 
    mutate(question2= ifelse(grepl("weight", question), "weight", "pain")) %>% 
    ggplot(aes(x=val, y=percent, fill = time)) + geom_col(position = "dodge") + facet_wrap(~question2) 

答えて

0

このコードは、あなたが後になっている視覚的な比較をしますか? ifelsegsubは、ファセットや塗りつぶしに使用できる変数をggplotにするのに役立ちます。

df %>% gather("question", "val") %>% # go long 
    mutate(time = factor(ifelse(grepl("before", question), "before", "after"), 
        c("before", "after")), # use factor with levels to control order 
      question = gsub(".*_", "", question)) %>% # clean for facets 
    ggplot(aes(x = val, fill = time)) + # use fill not color for whole bar 
    geom_bar(position = "dodge") + # stacking is the default option 
    facet_wrap(~question) # two panels 

enter image description here

+1

私はあなたが 'tidyr ::別々使ってワンステップで' mutate'を行うことができると思います(質問、C( "時間"、 "質問")、9月= "_") ' – FlorianGD

関連する問題