在 r 中为组的平均值创建折线图
Creating a line chart in r for the average value of groups
我正在尝试用 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 次,每个人的场合(周)都是相同的。一些受访者在一次或多次失踪。让我们说动机。性别、class 和 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()
作为分组变量,我想使用 class 或性别为例。
但是,我的方法不会导致连接每组平均值的线。
我还得到了每个测量场合的垂直线。这是什么意思?我冷想象解决这个问题的唯一方法是创建一个新变量 average.motivation 并计算每个场合每个组的平均值,然后将这个平均值分配给该组的所有成员。但是,这意味着当我想根据另一个因素显示组线时,我必须为每个组变量执行此操作。
另外,情节如何处理缺失数据? (如果一个组中的一个成员有缺失值,我仍然希望这个场合的组平均值来计算点而不是省略该组的整个场合)。
编辑:
谢谢,dplyr 的解决方案适用于我所有的分类变量。
现在,我试图弄清楚如何通过根据 second/third 因素为线条着色来区分子组。
例如,我为 "class2" 的组绘制了 20 条线,但不是让它们全部使用 20 种不同的颜色,我希望它们使用相同的颜色,如果它们属于相同类型的 class("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))
您几乎肯定必须确保这些分组变量是因子。
我不太确定你想要什么,但这是一个镜头...
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()
您还可以使用 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)。
另一种可能性是使用 stat_summary
,因此您只能使用 ggplot。
ggplot(data = DataRlong, aes(x = week, y = motivation, group = gender)) +
stat_summary(geom = "line", fun.y = mean)
我正在尝试用 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 次,每个人的场合(周)都是相同的。一些受访者在一次或多次失踪。让我们说动机。性别、class 和 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()
作为分组变量,我想使用 class 或性别为例。 但是,我的方法不会导致连接每组平均值的线。 我还得到了每个测量场合的垂直线。这是什么意思?我冷想象解决这个问题的唯一方法是创建一个新变量 average.motivation 并计算每个场合每个组的平均值,然后将这个平均值分配给该组的所有成员。但是,这意味着当我想根据另一个因素显示组线时,我必须为每个组变量执行此操作。 另外,情节如何处理缺失数据? (如果一个组中的一个成员有缺失值,我仍然希望这个场合的组平均值来计算点而不是省略该组的整个场合)。
编辑: 谢谢,dplyr 的解决方案适用于我所有的分类变量。 现在,我试图弄清楚如何通过根据 second/third 因素为线条着色来区分子组。 例如,我为 "class2" 的组绘制了 20 条线,但不是让它们全部使用 20 种不同的颜色,我希望它们使用相同的颜色,如果它们属于相同类型的 class("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))
您几乎肯定必须确保这些分组变量是因子。
我不太确定你想要什么,但这是一个镜头...
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()
您还可以使用 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)。
另一种可能性是使用 stat_summary
,因此您只能使用 ggplot。
ggplot(data = DataRlong, aes(x = week, y = motivation, group = gender)) +
stat_summary(geom = "line", fun.y = mean)