Присвоите имя фрейма данных заголовку ggplot в цикле purrr

#r #ggplot2 #purrr

#r #ggplot2 #purrr

Вопрос:

У меня есть два набора данных, из которых я хотел бы сгенерировать гистограммы, показывающие, как данные перекрываются по имени (A, B, C). Я написал пользовательскую функцию, чтобы я мог использовать ggplot с map2.

Я бы хотел, чтобы графики были озаглавлены в соответствии с именем каждого набора данных, поэтому «A», «B», «C.» Кто-нибудь знает способ сделать это?

 # load packages 
library(ggplot2)
library(dplyr)
library(purrr)

## load and format data 1
df1_raw <- data.frame(name = c("A", "B", "C", "A", "C", "B"), 
                 start = c(1, 3, 4, 5, 2, 1),  
                 end = c(6, 5, 7, 8, 6, 7)) 
df1 <- split(x = df1_raw, f = df1_raw$name) # split data by name
df1 <- lapply(df1, function(x) Map(seq.int, x$start, x$end)) # generate sequence intervals
df1 <- map(df1, unlist) # unlist sequences
df1 <- lapply(df1, data.frame) # convert to df

## load and format data 2
df2_raw <- data.frame(name = c("C", "B", "C", "A", "A", "B"), 
                      start = c(5, 4, 3, 4, 4, 5),  
                      end = c(7, 8, 7, 6, 9, 6)) 
df2 <- split(x = df2_raw, f = df2_raw$name) # split data by name
df2 <- lapply(df2, function(x) Map(seq.int, x$start, x$end)) # generate sequence intervals
df2 <- map(df2, unlist) # unlist sequences
df2 <- lapply(df2, data.frame) # convert to df

## write custom ggplot function and generate graphs
gplot <- function(data1, data2) {
  ggplot()   
    geom_histogram(data = data1, aes(x = X..i..),  binwidth = 1, color = "grey", fill = "grey")  
    geom_histogram(data = data2, aes(x = X..i..),  binwidth = 1, fill = "pink", alpha = 0.7)  
    labs(
      title = ls(data1))
}

hist <- map2(df1, df2, gplot)
 

Я также попробовал следующее в поле title в моей функции:

 deparse(substitute(data1))
 

Комментарии:

1. К вашему сведению — для форматирования кода вам нужны обратные метки (рядом с 1 ключом), а не одинарные кавычки

2. Спасибо, я использовал неправильный символ и был действительно сбит с толку тем, почему он не работает.

3. deparse(substitute(data1)) это обычный способ сделать это, но наличие его внутри purrr цикла усложняет задачу. Возможно, вам лучше всего отредактировать свою функцию, чтобы она принимала title аргумент и добавляла names(df1) его в список аргументов, которые вы перебираете.

Ответ №1:

Другой вариант, аналогичный тому, что @GregorThomas упомянул в комментариях, вы можете добавить переменную name в свой data.frames и извлечь из нее в своей gplot() функции. Я также показал, как вы можете объединить несколько шагов обработки данных:

 # load packages 
library(ggplot2)
library(dplyr)
library(purrr)

## load and format data 1
df1_raw <- data.frame(name = c("A", "B", "C", "A", "C", "B"), 
                      start = c(1, 3, 4, 5, 2, 1),  
                      end = c(6, 5, 7, 8, 6, 7)) 
df1 <- df1_raw %>%
  split(.$name) %>% # split data by name
  imap(function(x, x_name) {
    data.frame(value = Map(seq.int, x$start, x$end) %>% unlist,
               name = x_name)
  })

## load and format data 2
df2_raw <- data.frame(name = c("C", "B", "C", "A", "A", "B"), 
                      start = c(5, 4, 3, 4, 4, 5),  
                      end = c(7, 8, 7, 6, 9, 6)) 
df2 <- df2_raw %>%
  split(.$name) %>% # split data by name
  imap(function(x, x_name) {
    data.frame(value = Map(seq.int, x$start, x$end) %>% unlist,
               name = x_name)
  })

## change the title component of your previous function
gplot <- function(data1, data2) {
  ggplot()   
    geom_histogram(data = data1, aes(x = value),  binwidth = 1, color = "grey", fill = "grey")  
    geom_histogram(data = data2, aes(x = value),  binwidth = 1, fill = "pink", alpha = 0.7)  
    ggtitle(data1$name[1])
}

## plot it
map2(df1, df2, gplot)