Цикл по списку фреймов данных для создания графа в R - PullRequest
3 голосов
/ 04 апреля 2019

Я создал решетчатую диаграмму рассеяния, используя xyplot, которая сгруппирована в отдельные категории. Теперь я пытаюсь создать один гексплот для каждой из категорий на графике рассеяния. Я могу жестко запрограммировать переменные, но я бы предпочел сделать это в цикле, так как я буду делать это несколько раз, что будет иметь новые категории.

Я начал с таблицы, которая выглядит следующим образом

 Name     Category     Value1      Value2
sample1    cat1     10     1.5
sample2    cat2     10     1.5
sample3    cat3     10     1.5
sample4    cat1     10     1.5
sample5    cat1     10     1.5
sample6    cat2     10     1.5
sample7    cat3     10     1.5

Мне удалось создать список фреймов данных, используя

testing <- split(Mydata, Mydata$Category)

тогда я могу создать сюжет по

testing2 <- as.data.frame(testing[["cat1"]]) #I keep on needing to change this for each Category that I have
ggplot(testing2, aes(x = testing2[,3], y = testing2[,4])) +
  geom_hex(bins = 30)

testing2 выглядит так

 Name     Category     Value1      Value2
sample1    cat1     10     1.5
sample4    cat1     10     1.5
sample5    cat1     10     1.5

Я пытался

for(i in testing){
  testing3 <- i
  xtra <- ggplot(testing3, aes(x = testing3[,3], y = testing3[,4])) + geom_hex(bins = 30)
  xtra
}

Это заканчивается тем, что xtra является последним фреймом данных в списке.

Может ли кто-нибудь помочь мне с этим? Я хотел бы иметь возможность создавать графики, не меняя $ Category каждый раз, так как у меня есть> 50 категорий на каждый раз, когда я хочу это сделать.

- edit1 Согласно предложению, я создал функцию;

myFirstFun <- function(column)
{
  testing2 <- as.data.frame(testing[[column]])
  column <- enquo(column)
  ggplot(testing2, aes_string(x ="Value1", y = "Value2", group = column)) +
    geom_hex(bins = 30)
}

И это;

myFirstFun("cat1")

производит это;

 Name     Category     Value1      Value2
sample1    cat1     10     1.5
sample4    cat1     10     1.5
sample5    cat1     10     1.5

но когда я пытаюсь использовать цикл for;

for(i in categorynames){###categorynames is a vector that has all my categorynames
  myFirstFun(i)
}

будет отображаться только последний график в списке. Как бы я сделал это, чтобы получить n количество графиков (n = количество моих категорий)? Без меня вручную делать

myFirstFun("cat1")
myFirstFun("cat2")
myFirstFun("cat3")
...

1 Ответ

2 голосов
/ 04 апреля 2019

Вы можете встроить функцию, в которой вы используете dplyr::filter для выбора нужного Category, а затем выполняете построение.

Для циклического прохождения каждого Category используйте purrr::map и сохраните все результаты всписок.Оттуда вы можете распечатать график по вашему выбору или объединить их все вместе в 1 страницу или несколько страниц

library(tidyverse)

df <- read.table(text = "Name     Category     Value1      Value2
sample1    cat1     11     2.5
sample2    cat2     13     1.5
sample3    cat3     12     3.5
sample4    cat1     15     6.5
sample5    cat1     17     4.5
sample6    cat2     14     7.5
sample7    cat3     16     1.5",
                 header = TRUE, stringsAsFactors = FALSE)

cat_chart1 <- function(data, category){

  df <- data %>% 
    filter(Category == category)

  plot1 <- ggplot(df, aes(x = Value1, y = Value2)) + 
    geom_hex(bins = 30)

  return(plot1)
}

# loop through all Categories
plot_list <- map(unique(df$Category), ~ cat_chart1(df, .x)) 
plot_list[[1]]                 

# combine all plots
library(cowplot)
plot_grid(plotlist = plot_list, ncol = 2)

Создано в 2019-04-04 пакетом Представить (v0.2.1.9000)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...