在实现这个图之前我应该​​如何格式化我的数据?

发布于 2024-11-26 13:10:42 字数 299 浏览 1 评论 0原文

我想在一个图中绘制三个图表:随时间变化的上四分位数、中位数和下四分位数。

现在我有这种格式的数据:

t_1 x_1 x_2 ... x_n
t_2 x_1 x_2 ... x_n
... ... ... ... ...
t_m x_1 x_2 ... x_n

即,在 m 个时间点的 n 个观测值。

有没有更适合在 R 中实现此任务的输入格式?

由于我使用 R 的经验非常有限,我希望避免在 R 中转换数据。我从几个不同的文件中收集数据,因此在预处理数据时我非常灵活。

I want to plot three graphs in one plot: upper quartile, median, and lower quartile over time.

Right now I have the data in this format:

t_1 x_1 x_2 ... x_n
t_2 x_1 x_2 ... x_n
... ... ... ... ...
t_m x_1 x_2 ... x_n

That is, n observations at m points in time.

Is there an input format better suited for realizing this task in R?

As my experience with R is very limited I'd like to avoid having to transform the data in R. I collect it from a couple of different files, so I'm pretty flexible when it comes to preprocessing the data.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

等风也等你 2024-12-03 13:10:42

在我看来,你希望你的数据看起来像:

t   lq   med   uq
1   ..    ..   ..
2   ..    ..   ..
3   ..    ..   ..
4   ..    ..   ..

因此,你拥有的格式似乎很好。一旦进入 R,您就可以使用 apply 生成正确的三列:

res.df <- data.frame(t(apply(my.data.frame[,2:ncol(my.data.frame)], 1, quantile,probs=c(.25,.5,.75))))
res.df$t <- my.data.frame[,1]

res.df
         X25.        X50.        X75.   t
1 0.028624900 0.031074701 0.037136365 200
2 0.016687651 0.021395864 0.025269186 300
3 0.010939904 0.014344707 0.016897053 400
4 0.007891868 0.009855513 0.011671379 500
5 0.006553960 0.008057315 0.009885929 600
6 0.005831083 0.006755695 0.008090646 700

然后进行绘图。

# Sample data
t=seq(33)
lq=runif(33)
med = lq+runif(33)*2
res.df <- data.frame( t=t, lq=lq, med = med, uq=med+runif(33)*2 )
colnames(res.df) <- c("t","lq","med","uq")

# Base graphics
plot(lq~t,data=res.df,type="l",col="springgreen",ylim=range(c(lq,uq)))
lines(med~t,data=res.df,col="steelblue")
lines(uq~t,data=res.df,col="springgreen")

基础图形

# ggplot2
res.df <- melt(res.df,id.vars="t")
library(ggplot2)
p <- ggplot(res.df, aes(y=value,x=t,colour=variable) )
p + geom_line()

Seems to me that you want your data to look like:

t   lq   med   uq
1   ..    ..   ..
2   ..    ..   ..
3   ..    ..   ..
4   ..    ..   ..

Therefore, the format you have it in seems to be just fine. Once it's in R, you can use apply to produce the right three columns:

res.df <- data.frame(t(apply(my.data.frame[,2:ncol(my.data.frame)], 1, quantile,probs=c(.25,.5,.75))))
res.df$t <- my.data.frame[,1]

res.df
         X25.        X50.        X75.   t
1 0.028624900 0.031074701 0.037136365 200
2 0.016687651 0.021395864 0.025269186 300
3 0.010939904 0.014344707 0.016897053 400
4 0.007891868 0.009855513 0.011671379 500
5 0.006553960 0.008057315 0.009885929 600
6 0.005831083 0.006755695 0.008090646 700

Then just plot.

# Sample data
t=seq(33)
lq=runif(33)
med = lq+runif(33)*2
res.df <- data.frame( t=t, lq=lq, med = med, uq=med+runif(33)*2 )
colnames(res.df) <- c("t","lq","med","uq")

# Base graphics
plot(lq~t,data=res.df,type="l",col="springgreen",ylim=range(c(lq,uq)))
lines(med~t,data=res.df,col="steelblue")
lines(uq~t,data=res.df,col="springgreen")

base graphics

# ggplot2
res.df <- melt(res.df,id.vars="t")
library(ggplot2)
p <- ggplot(res.df, aes(y=value,x=t,colour=variable) )
p + geom_line()

ggplot2 graphics

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文