2017-11-25 109 views
1

)我有一個包含四個三級分類變量的數據框:before_weight,after_weight,before_pain和after_pain。按ggplot2中的因子級別分組(

我想製作一個條形圖,顯示每個變量級別的比例。我目前的代碼達到了。

問題是數據的表示。我希望將酒吧之前和之後的各個酒吧分組在一起,以便代表before_weight變量中回答1的人員的酒吧在代表after_weight變量中回答1的人員的酒吧旁邊進行分組,以此類推體重和疼痛變量。

我一直試圖使用dplyr,mutate()與衆多的ifelse()語句,使一個新變量配對有問題的組,但似乎無法讓它工作。

任何幫助將不勝感激。

起點(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:

我想比例,而不是數,所以我已經嘗試調整Nate的代碼。由於我使用問題變量來分組數據以得到比例,我似乎無法使用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

這段代碼是否使你在之後的視覺比較?其中一個ifelse和一個gsub將幫助製作我們可用於分解和填充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 ::獨立的(問題,C( 「時間」, 「問題」),九月= 「_」)做了'mutate'一步到位' – FlorianGD