首页 文章

在r中为组的平均值创建折线图

提问于
浏览
2

我正在尝试使用r创建简单的折线图,连接数据点的受访者组的平均值(也可以用它们标注或用不同的颜色区分它们等) . 我的数据是长格式并按照显示的顺序排序(I如果有任何 Value ,它也有宽格式):

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次,每个人的场合(周)都是相同的 . 一些受访者在一次或多次失踪 . 让我们说动机 . 性别,类和ID等变量不会改变,动机也会改变 . 我试图使用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的解决方案适用于我的所有分类变量 . 现在,我试图找出如何通过基于第二/第三因素着色线来区分子组 . 例如,我为“class2”组绘制了20行,但是如果它们属于相同类型的类(“class_type”),我希望它们使用相同的颜色,而不是将它们全部用于20种不同的颜色 . 例如A,B或C = 20行,三组颜色) .

我已将第二个因素添加到“mean_data2” . 这很好用 . 接下来,我试图改变ggplot中的颜色参数,(也尝试在geom_line中),但是这样,我再也没有20行了 .

mean_data2 < - group_by(DataRlong,class2,class_type,occ)%>%summary(procras = mean(procras,na.rm = TRUE))library(ggplot2)ggplot(na.omit(mean_data2),aes(x = occ) ,y = procras,color = class2))geom_point()geom_line(aes(color = class_type))

3 回答

  • 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()
    

    enter image description here

    此处无需明确使用 group 美学,因为 ggplot 将根据图中的分类变量自动对线进行分组 . 而你唯一的分类变量是 gender . (有关更多信息,请参阅this answer) .

  • 2

    你几乎肯定要确保那些分组变量是因素 .

    我不太确定你想要什么,但这里有一个镜头......

    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()
    

    enter image description here

  • 0

    另一种可能性是使用 stat_summary ,所以你只能使用 ggplot .

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

相关问题