2017-11-25 2 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

나는'당신이 ("질문") 9 월 = "_"를 질문, C ("시간")'tidyr :: 별도의를 사용하여 한 단계에서'mutate'을 할 수 있다고 생각 – FlorianGD

관련 문제