【问题标题】:Creating a line chart in r for the average value of groups在 r 中为组的平均值创建折线图
【发布时间】:2016-03-10 15:16:13
【问题描述】:

我正在尝试使用 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 的解决方案对我所有的分类变量都很有效。 现在,我试图弄清楚如何通过基于第二个/第三个因素为它们的线条着色来区分子组。 例如,我为“class2”组绘制了 20 条线,但不是让它们都使用 20 种不同的颜色,而是希望它们使用相同的颜色,如果它们属于相同类型的类(“class_type” ,例如A、B或C =20行,三组颜色)。

我已将第二个因素添加到“mean_data2”。效果很好。接下来,我尝试更改 ggplot 中的颜色参数,(也尝试在 geom_line 中),但那样我就没有 20 行了。

mean_data2 % 总结(procras = mean(procras,na.rm = TRUE))

图书馆(ggplot2) ggplot(na.omit(mean_data2), aes(x = occ, y = procras, colour=class2)) + geom_point() + geom_line(aes(colour=class_type))

【问题讨论】:

    标签: r ggplot2 line linechart trendline


    【解决方案1】:

    您也可以使用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。 (有关更多信息,请参阅this answer)。

    【讨论】:

    • 您能解释一下 main_data 应该是什么样子以及“%>%”命令代表什么吗?包括它会给我错误:错误:期望单个值
    • 排除%>%给了我:[img]i.imgur.com/Y16iEzv.png[/img](使用我自己的数据集,结构基本上是一些,只有更多的变量)'code' mean_data
    • %&gt;% 是一个管道运算符,所以x %&gt;% f(y) 等价于f(x, y)。如果省略%&gt;%,则mean_dataDataRlong 相同。代码应为mean_data &lt;- group_by(DataRlong, sex, occ) %&gt;% summarise(procras = mean(procras, na.rm = TRUE))。总而言之,您不需要重复 DataRlong%&gt;% 运算符会处理此问题。
    【解决方案2】:

    另一种可能性是使用stat_summary,因此您只能使用ggplot

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

    【讨论】:

      【解决方案3】:

      几乎可以肯定,您必须确保这些分组变量是因素。

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

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

      【讨论】:

      • 这种类型的图基本就是我想要的。它显示了随着时间的推移的发展。但是,我想绘制每个场合每个组的平均值。所以在这个例子中,不是三行,而是两个男性每次的平均值将形成一条线,女性的点在第二条线。
      • @user107345 编辑了计算和图形平均值的答案
      • 非常感谢,我没有 Dytr 包,所以我试试这个答案,效果很好!!!
      猜你喜欢
      • 2023-04-03
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多