Создание линейного графика в r для среднего значения групп

Я пытаюсь создать простые линейные диаграммы с r, которые соединяют точки данных в среднем по группам респондентов (также можно было бы пометить их или различать их разными цветами и т. Д.) Мои данные имеют длинный формат и отсортированы, как показано (я также имейте это в широком формате, если это имеет какое-либо значение):

    ID  gender  week  class  motivation
    1   male    0     1       100
    1   male    6     1       120
    1   male    10    1       130
    ...
    2   female  0     1       90
    2   female  6     1       NA
    2   female  10    1       117
    ...
    3   male    0     2       89
    3   male    6     2       112
    3   male    10    2       NA
    ...

В основном, каждого респондента измеряли n раз, и случаи (неделя) были одинаковыми для всех. Некоторые респонденты отсутствовали один или несколько раз. Скажем, для мотивации. Такие переменные, как пол, класс и идентификатор, не меняются, но меняется мотивация. Я попытался получить линейную диаграмму с помощью ggplot2

 ## define base for the graphs and store in object 'p'
plot <- ggplot(data = DataRlong, aes(x = week, y = motivation, group = gender))
plot + geom_line()

В качестве группирующей переменной я хочу использовать, например, класс или пол. Однако мой подход не приводит к линиям, соединяющим средние значения по группе. Я также получаю вертикальные линии для каждого случая измерения. Что это значит? Единственный способ, которым я могу это исправить, - это создать новую переменную average.motivation и вычислить среднее значение для каждой группы для каждого случая, а затем назначить это среднее значение для всех членов группы. Однако это означало бы, что я должен был сделать это для каждой отдельной групповой переменной, когда я хочу отображать групповые строки на основе другого фактора. Кроме того, как график обрабатывает недостающие данные? (Если у одного из членов группы отсутствует значение, я все же хочу, чтобы среднее значение группы для этого случая использовалось для вычисления точки, а не пропускало все событие для этой группы).

Изменить: Спасибо, решение с dplyr отлично работает для всех моих категориальных переменных. Теперь я пытаюсь понять, как я могу различать подгруппы, раскрашивая их линии на основе второго / третьего фактора. Например, я рисую 20 линий для групп «class2», но вместо того, чтобы иметь все они в 20 разных цветах, я бы хотел, чтобы они использовали один и тот же цвет, если они принадлежат к одному типу класса («class_type» , например A, B или C = 20 линий, три группы цветов).

Я добавил второй фактор в "mean_data2". Это хорошо работает. Затем я попытался изменить аргумент цвета в ggplot (также пробовал, как в geom_line), но таким образом у меня больше нет 20 строк.

mean_data2 ‹- group_by (DataRlong, class2, class_type, occ)%>% summarize (procras = mean (procras, na.rm = TRUE))

библиотека (ggplot2) ggplot (na.omit (mean_data2), aes (x = occ, y = procras, color = class2)) + geom_point () + geom_line (aes (color = class_type))


person Rasul89    schedule 10.03.2016    source источник


Ответы (3)


Вы также можете использовать пакет dplyr для агрегирования данных:

library(dplyr)
mean_data <- group_by(data, gender, week) %>%
             summarise(motivation = mean(motivation, na.rm = TRUE))

Вы можете использовать na.omit(), чтобы избавиться от значений NA следующим образом:

library(ggplot2)
ggplot(na.omit(mean_data), aes(x = week, y = motivation, colour = gender)) +
  geom_point() + geom_line()

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

Здесь нет необходимости явно использовать эстетику group, потому что ggplot автоматически сгруппирует строки по категориальным переменным на вашем графике. И единственная имеющаяся у вас категориальная переменная - gender. (Дополнительную информацию см. В этом ответе).

person Stibu    schedule 10.03.2016
comment
Не могли бы вы объяснить, как должна выглядеть main_data и что означает команда% ›%? В том числе это дает мне ошибку: Ошибка: ожидание одного значения - person Rasul89; 10.03.2016
comment
Исключая% ›%, я получил: [img] i.imgur.com/Y16iEzv.png [/ img] (Используя мой собственный набор данных, структура в основном представляет собой некоторые, только несколько переменных) 'code' mean_data ‹- group_by (DataRlong, sex, occ) summarize (DataRlong, procras = mean (procras, na .rm = TRUE)) library (ggplot2) ggplot (na.omit (mean_data), aes (x = occ, y = procras, color = sex)) + geom_point () + geom_line () - person Rasul89; 10.03.2016
comment
%>% является оператором канала, поэтому x %>% f(y) эквивалентно f(x, y). Если вы опустите %>%, то mean_data идентично DataRlong. Код должен быть mean_data <- group_by(DataRlong, sex, occ) %>% summarise(procras = mean(procras, na.rm = TRUE)). Подводя итог, вам не нужно повторять DataRlong, оператор %>% позаботится об этом. - person Stibu; 10.03.2016

Другой вариант - использовать stat_summary, поэтому вы можете сделать это только с помощью ggplot.

ggplot(data = DataRlong, aes(x = week, y = motivation, group = gender)) + 
   stat_summary(geom = "line", fun.y = mean)
person Adriano Rivolli    schedule 25.10.2018

Вы почти наверняка должны убедиться, что эти группирующие переменные являются факторами.

Я не совсем уверен, что вы хотите, но вот шанс ...

library("ggplot2")
df <- read.table(textConnection("ID  gender  week  class  motivation
1   male    0     1       100
1   male    6     1       120
1   male    10    1       130
2   female  0     1       90
2   female  6     1       NA
2   female  10    1       117
3   male    0     2       89
3   male    6     2       112
3   male    10    2       NA"), header=TRUE, stringsAsFactors=FALSE)

df2 <- aggregate(df$motivation, by=list(df$gender, df$week), 
             function(x)mean(x, na.rm=TRUE))
names(df2) <- c("gender", "week", "avg")
df2$gender <- factor(df2$gender)
ggplot(data = df2[!is.na(df2$avg), ], 
       aes(x = week, y = avg, group=gender, color=gender)) + 
  geom_point()+geom_line()

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

person cory    schedule 10.03.2016
comment
Этот тип графика - это в основном то, что мне нужно. Он показывает развитие во времени. Однако я хотел бы построить средние значения для каждой группы по каждому случаю. Итак, в этом примере вместо трех линий средние значения для каждого случая для двух мужчин будут формировать одну линию, а точки для женщин - вторую линию. - person Rasul89; 10.03.2016
comment
@ user107345 отредактировал ответ для вычисления средних значений и построения графика - person cory; 10.03.2016
comment
Большое спасибо, у меня нет пакета Dytr, поэтому я пробую этот ответ, он отлично работает !!! - person HanniBaL90; 24.11.2016