在r中为组

时间:2016-03-10 15:16:14

标签: r ggplot2 line linechart trendline

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

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

  

mean_data2&lt; - group_by(DataRlong,class2,class_type,occ)%&gt;%   总结(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 个答案:

答案 0 :(得分: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。)

答案 1 :(得分: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

答案 2 :(得分:0)

另一种可能是使用stat_summary,因此您只能使用 ggplot 来做到这一点。

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