Постройте график с помощью набора данных, в котором каждый столбец относится к другому дню

#r #ggplot2 #mean

Вопрос:

Привет, у меня, вероятно, есть этот вопрос, но я довольно давно не касался R, У меня есть большой набор данных, где каждый столбец является результатом измерений за день (день 1, день 2 и т. Д.), А строки-это разные копии обработки. Мне уже удалось составить таблицу со всеми средствами и свести данные к тому, где у меня есть обработки в виде строк и среднее значение каждого дня в столбцах. Теперь я хочу отобразить эти данные в виде разброса или линий, но, похоже, я не знаю, что использовать в качестве aes(x=) и есть ли способ отобразить их все, используя один код, а не добавляя каждый geom_point() для каждого дня и лечения.

Ниже приведен пример, поскольку данные являются более длинными и сложными (24 дня и 28 процедур с общим количеством повторений 10). Как я мог бы построить данные так, чтобы они выглядели следующим образом (изображение Excel)введите описание изображения здесь Заранее спасибо всем, любая помощь или обратная связь будут высоко оценены

 #df#
treatment    day 1    day 2    day 3
1        t1 7.524814 8.330983 6.639391
2        t1 6.056334 6.138648 5.439239
3        t2 4.377818 4.964445 3.990593
4        t1 6.834753 7.070450 5.895462
5        t3 7.378768 8.375725 7.210010
6        t2 4.104087 4.942359 3.589360
7        t2 4.520651 4.775113 3.753422
8        t3 7.875438 8.543303 8.101697
9        t3 7.803648 8.232132 7.073342

mean<-aggregate(df[,2:4],list(df$treatment),mean)
sd<-aggregate(df[,2:4],list(df$treatment),sd)

#mean#
Group.1    day 1    day 2    day 3
1      t1 6.805300 7.180027 5.991364
2      t2 4.334185 4.893972 3.777792
3      t3 7.685951 8.383720 7.461683

ggplot() geom_point(mean,aes(x=??,y=mean$"day 1")
 

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

1. Спасибо вам обоим за ваши ответы, но как-то дни смешались. Я получаю: день 1, 10 , 11, 12,…, 2, 20, 21, 22, 23, 24, 3, 4, 5, 6, …, 9. Есть ли способ это исправить?

Ответ №1:

Есть несколько способов, как вы могли бы выполнить свою задачу:

  1. приведите свои данные в длинном формате.
  2. некоторые споры о данных
  3. ggplot() Версия 1:
 library(tidyverse)
  df %>% 
    pivot_longer(
      cols = -treatment,
      names_to = "day",
      values_to = "values"
    ) %>% 
    group_by(treatment, day) %>% 
    summarise(mean = mean(values)) %>% 
    ggplot(aes(x=day, y=mean, color=treatment, group=treatment))   
    geom_line()
 

введите описание изображения здесь

Версия 2

 library(tidyverse)
df %>% 
  pivot_longer(
    cols = -treatment,
    names_to = "day",
    values_to = "values"
  ) %>% 
  group_by(day) %>% 
  summarise(mean = mean(values)) %>% 
  ggplot(aes(x=day, y=mean, group=1))   
  geom_point()  
  geom_line(colour="red")
 

введите описание изображения здесь

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

1. Спасибо вам за ваш ответ. Версия 1, похоже, то, что мне нужно, но я смешиваю даты в большем наборе данных (дни от 1 до 24). Я получаю их в таком порядке: 1, 10,11,12,13,…,19,2,20,21,22,23,24,3,4,5,6,..,9. Есть ли способ исправить порядок?

2. установите дни as.factor и используйте fct_reorder их в своем наборе данных.

Ответ №2:

ggplot любит данные в «длинном» формате. Вот один из способов сделать это для mean ценностей, вы можете сделать то же самое для sd .

 library(tidyverse)

df %>%
  pivot_longer(cols = -treatment) %>%
  group_by(treatment, name = factor(name, unique(name))) %>%
  summarise(value = mean(value), .groups = 'drop') %>%
  ggplot(aes(name, value, color = treatment, group = treatment))   geom_line()
 

введите описание изображения здесь