Я хотел бы использовать do
, чтобы создать несколько ggplots на основе сгруппированного фрейма данных, но внести изменения в график, а именно изменить ось Y, если столбец содержит определенное значение.
Iсмоделировал мой подход после ответа Хэдли на этот вопрос: dplyr :: do () требует именованной функции?
У меня проблема с получением объекта gg во фрейм данных для его возвратаКак мне вручную сделать то, что do
автоматически сделало в моем рабочем примере ниже, и «обернуть» объект gg чем-то, что можно поместить во фрейм данных?
df <- data.frame( position=rep(seq(0,99),2),
strand=c(rep("-",100),rep("+",100)),
score=rnorm(200),
gene=c(rep("alpha",100),rep("beta",100))
)
Это прекрасно работает:
plots <- df %>%
group_by(gene) %>%
do(plot=
ggplot(.,aes(position,score)) +
geom_point()
)
plots
Результат:
# A tibble: 2 x 2
gene plot
* <fct> <list>
1 alpha <S3: gg>
2 beta <S3: gg>
Это не:
plots <- df %>%
group_by(gene) %>%
do({
plot <- ggplot(.,aes(position,score)) +
geom_point()
if (all(.$strand=="-")) {
plot <- plot + scale_y_reverse()
}
data.frame(., plot) ##!! <<< how to get the ggplot object into a data frame
})
plots
Сбой с ошибкой:
Error in as.data.frame.default(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors) :
cannot coerce class "c("gg", "ggplot")" to a data.frame