我有一些年度足球数据,我想测试一下,看看明年某些球队指标是否可重复.我的数据在data.frame中,看起来像这样:
y2003 y2004 y2005
Team 1 51.95455 51.00000 53.59091
Team 2 54.18182 56.31818 49.09091
Team 3 48.68182 46.86364 49.22727
Team 4 50.86364 47.68182 48.72727
Run Code Online (Sandbox Code Playgroud)
我想要做的是在x轴上用"Year n"和y轴上的"Year n + 1"进行散点图.因此,例如2003年与2004年,2004年与2005年,2005年与2006年等等都在同一情节中.
然后,我希望能够画出一条最合适的线,看看相关性有多强,无论它是否可重复.
使用ggplot2在R中执行此操作的最佳方法是什么?我可以得到最初的情节:
p=ggplot(df,aes(y2003,y2004))
p + geom_point()
Run Code Online (Sandbox Code Playgroud)
然后我只需要手动添加它们吗?这种东西有内置功能吗?如果我逐一添加它们,我将如何获得最佳效果?
您需要一个数据框,其中每个团队年份组合都有一行,其中包含当年和下一年的数据以及团队名称。实际上,您无需使用基本 R 函数进行任何拆分-应用-组合操作即可获得此结果:
(to.plot <- data.frame(yearN=unlist(df[-ncol(df)]),
yearNp1=unlist(df[-1]),
team=rep(row.names(df), ncol(df)-1)))
# yearN yearNp1 team
# y20031 51.95455 51.00000 Team1
# y20032 54.18182 56.31818 Team2
# y20033 48.68182 46.86364 Team3
# y20034 50.86364 47.68182 Team4
# y20041 51.00000 53.59091 Team1
# y20042 56.31818 49.09091 Team2
# y20043 46.86364 49.22727 Team3
# y20044 47.68182 48.72727 Team4
Run Code Online (Sandbox Code Playgroud)
基本上,此代码将除最后一列之外的所有列转换df
为向量(使用unlist
),并将它们存储在变量 中yearN
。可以通过将除第一列之外的所有列抓取df
到向量中来获得下一年。最后,可以通过 的行名称的重复序列获得团队名称df
。
获得最佳拟合线是一个简单的线性回归模型:
(coefs <- coef(lm(yearNp1~yearN, data=to.plot)))
# (Intercept) yearN
# 28.3611927 0.4308978
Run Code Online (Sandbox Code Playgroud)
现在ggplot
可以照常用于绘图:
library(ggplot2)
ggplot(to.plot, aes(x=yearN, y=yearNp1, col=team)) + geom_point() +
geom_abline(intercept=coefs[1], slope=coefs[2])
Run Code Online (Sandbox Code Playgroud)