例如,让我们使用来自airquality
的臭氧数据。我有离散的x值(风)和y值(臭氧)。臭氧中的某些y值具有相同的x值,因此我想取其中y值的平均值并作图。
例如
(5,10)
(5,20)
(5,40)
我们将绘制(5,23.33)。我将对所有x值执行此操作,并将它们全部连接。
我尝试了此操作,但是由于某种原因我看不到该行。
data(airquality)
plot(Ozone ~ Wind, data = airquality)
lines(weighted.mean(airquality$Ozone, airquality$Wind))
答案 0 :(得分:1)
不清楚您为什么使用weighted.mean
。但是,您可以看到为什么没有行:
weighted.mean(airquality$Ozone, airquality$Wind)
[1] NA
添加na.rm = TRUE
参数仍将仅返回一个值:
weighted.mean(airquality$Ozone, airquality$Wind, na.rm = TRUE)
[1] 34.99825
也许直到现在我们对数据有了更好的了解之前,我们还是会坚持使用mean
。
在ggplot2
中使用stat_summary
通过平均值绘制摘要非常简单:
library(ggplot2)
ggplot(airquality, aes(Wind, Ozone)) +
stat_summary(geom = "point", fun.y = mean)
我建议进行一些增强:
添加平滑线
ggplot(airquality, aes(Wind, Ozone)) +
geom_point(color = "grey90") +
stat_summary(geom = "point",
fun.y = mean,
color = "red") +
geom_smooth()
结果:
答案 1 :(得分:1)
我不确定这是否是您要寻找的东西。
由于Wind
是连续的,因此如果要按其分组,则必须以某种方式离散化。我选择通过将Wind
按分位数或更具体地说是十分位数进行分组来实现。然后,我计算了Ozone
的均值,并按这些Wind
分位数进行分组。
data(airquality)
br <- quantile(airquality$Wind, seq(0, 1, length=11))
mid <- br[-length(br)] + diff(br)/2
wind.bin <- cut(airquality$Wind, breaks=br)
agg.oz <- aggregate(airquality$Ozone, list(wind.bin), mean, na.rm=TRUE)
colnames(agg.oz) <- c("Wind.mean", "Ozone.mean")
agg.oz[1] <- mid
plot(Ozone ~ Wind, data=airquality, pch=16, cex=0.6)
abline(v=br, col="#00000022", lty=2)
lines(agg.oz, col="red", type="o", pch=16)
legend("topright", legend="Mean ozone by \nwind quantile",
col="red", lwd=1.1, bty="n", cex=0.8)
如果您坚持将Wind
视为离散值,则可以这样做
data(airquality)
airquality <- airquality[complete.cases(airquality),]
agg.oz <- aggregate(Ozone ~ Wind, data=airquality, mean, na.rm=TRUE)
colnames(agg.oz) <- c("Wind.mean", "Ozone.mean")
plot(Ozone ~ Wind, data=airquality, pch=16, cex=0.6)
lines(agg.oz, col="red", type="o", pch=16)