График рабочего статуса для каждой когорты с использованием ggplot2?

У меня есть следующий снимок) моего набора данных:

df<-data.frame( c(2014, 2015, 2016, 2014, 2015, 2016, 2014, 2015, 2016), c(1,1,1,1,1,1,2,2,2), c(1,1,0,0,0,0,0,0,0), c("q1", "q1", "q1", "q2","q2","q2", "q3", "q3", "q3"))
colnames(df)<-c("year", "male.cohort", "male.work", "householdid")

(В моем реальном наборе данных у меня есть месячные данные, но идея та же).

Используя эти данные, я хотел бы построить две линии (одну для мужской когорты, равную единице, и одну для мужской когорты, равную 2), которые представляют долю мужчин, работающих в каждый момент времени (в данном случае 2014, 2015, 2016) . Я попытался использовать следующий код, но он не дает мне решения, которое я ищу:

test <- as.data.frame(unlist(tapply(df$male.work,INDEX = df[,c("year","male.cohort")], function(x){sum(x)/length(x)})))
colnames(test) <- "frac"
test$year <- rownames(test)
ggplot()+geom_line(data = test, aes(x=year,y=frac)) 

Я думаю, что делаю что-то неправильно при использовании tapply, поскольку он дает правильный процент каждой когорты, работающей в каждый год, но не представляет ее для каждой когорты.

Буду признателен за любую помощь.


person Albert    schedule 12.12.2019    source источник


Ответы (1)


Наверное можно попробовать

library(dplyr)
library(ggplot2)

df %>%
  mutate_at(vars(year, male.cohort), factor) %>%
  group_by(year, male.cohort) %>%
  summarise(work_perc = sum(male.work)/n()) %>% 
  ggplot() + aes(year, work_perc, color = male.cohort, group = male.cohort) + 
  geom_line()
person Ronak Shah    schedule 12.12.2019
comment
Возможно, у вас есть альтернатива делению на n() в команде суммирования? По какой-то причине это не работает с моим большим набором данных? В нем говорится, что он недействителен (может использоваться только для data.frames) - person Albert; 12.12.2019
comment
@Albert Если у вас есть только 1/0 в male.work, вы можете использовать summarise(work_perc = mean(male.work)) вместо summarise. - person Ronak Shah; 13.12.2019