2

我正在尝试使用 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 <- group_by(DataRlong, class2, class_type, occ)%>% summarise(procras = mean(procras, na.rm = TRUE))

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

4

3 回答 3

5

您还可以使用该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. (有关更多信息,请参阅此答案)。

于 2016-03-10T17:14:39.807 回答
3

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

ggplot(data = DataRlong, aes(x = week, y = motivation, group = gender)) + 
   stat_summary(geom = "line", fun.y = mean)
于 2018-10-25T23:06:13.397 回答
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()

在此处输入图像描述

于 2016-03-10T16:09:03.597 回答