首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将两个不同年份的数据框组合在一起,形成一个图

将两个不同年份的数据框组合在一起,形成一个图
EN

Stack Overflow用户
提问于 2020-06-10 07:33:55
回答 1查看 265关注 0票数 0

我正在尝试将3个独立的数据帧( 2018,2019和2020文件)组合在一起,以制作一个从1月到12月的时间序列图,但到目前为止,我只能制作一个长图,2018年1月到2020年6月。我希望看到一张线形图,每一条线代表一年。下面粘贴了3年数据的预览。很难从下面看出,但是月、日和小时都在单独的列中。

谢谢你的帮忙!

代码语言:javascript
复制
2020 DATA
Site        Parameter           Date (LT)       Year    MonthDayHourRaw Conc.
Kathmandu   PM2.5 - Principal   1/1/2020 1:00   2020    1   1   1   171
Kathmandu   PM2.5 - Principal   1/1/2020 2:00   2020    1   1   2   161
Kathmandu   PM2.5 - Principal   1/1/2020 3:00   2020    1   1   3   121
Kathmandu   PM2.5 - Principal   1/1/2020 4:00   2020    1   1   4   119
Kathmandu   PM2.5 - Principal   1/1/2020 5:00   2020    1   1   5   137

2019 DATA
Site    Parameter               Date (LT)       Year    MonthDayHourRaw Conc.
Kathmandu   PM2.5 - Principal   1/1/2019 1:00   2020    1   1   1   200
Kathmandu   PM2.5 - Principal   1/1/2019 2:00   2020    1   1   2   185
Kathmandu   PM2.5 - Principal   1/1/2019 3:00   2020    1   1   3   180
Kathmandu   PM2.5 - Principal   1/1/2019 4:00   2020    1   1   4   190
Kathmandu   PM2.5 - Principal   1/1/2019 5:00   2020    1   1   5   200


2018 DATA
Site        Parameter           Date (LT)       Year    MonthDayHourRaw Conc.
Kathmandu   PM2.5 - Principal   1/1/2019 1:00   2020    1   1   1   250
Kathmandu   PM2.5 - Principal   1/1/2019 2:00   2020    1   1   2   215
Kathmandu   PM2.5 - Principal   1/1/2019 3:00   2020    1   1   3   270
Kathmandu   PM2.5 - Principal   1/1/2019 4:00   2020    1   1   4   221
Kathmandu   PM2.5 - Principal   1/1/2019 5:00   2020    1   1   5   250
EN

回答 1

Stack Overflow用户

发布于 2020-06-11 01:48:00

如果您能够以一种易于复制的格式发布数据帧,比如使用dput(data.frame),那将会很有帮助。无论如何,我已经通过创建以下单个数据帧、df_2018df_2019df_2020大致复制了您的数据集。

代码语言:javascript
复制
df_2018 <- data.frame(Raw.Conc=c(171,161,121,119,137), Date=c('1/5/2018','2/12/2018','3/1/2018','4/4/2018','5/2/2018'))
df_2019 <- data.frame(Raw.Conc=c(200,185,180,190,200), Date=c('1/2/2019','2/12/2019','3/3/2019','4/1/2019','5/6/2019'))
df_2020 <- data.frame(Raw.Conc=c(250,215,270,221,250), Date=c('1/1/2020','2/5/2020','3/4/2020','4/7/2020','5/5/2020'))

数据的准备

每个数据帧包含两列:一列是数字向量$Raw.Conc,另一列现在是因子$Date。第一步是我们应该将这些数据库合并为一个数据库。至关重要的是,我们需要维护有关每个数据集的来源的信息,我可以首先为每个数据集创建一个名为$origin之类的新列,但是在使用lubridate包将$Date列转换为一个Date类并为每个日期提取具体年份之后,按类别分离数据会更简单。请参见以下代码:

代码语言:javascript
复制
# merging datasets
df <- rbind(df_2018, df_2019, df_2020)

# format $Date field
df$Date <- as.Date(df$Date, format='%m/%d/%Y')

# create new column for year
df$Year <- as.character(year(df$Date))

注意,我使用了lubridate中的year()函数来创建df$Yearyear()的输出是数字的,所以我将其转换为字符向量,以确保此特定列被视为离散的,而不是连续的,以便我们稍后使用。

绘图

这足以创建图,但请记住,df$Date表示不同的年份,因此线不会重叠x轴上的相同空间,而是分开的。当我们将df$Date绘制为x轴,将df$Raw.Conc绘制在y轴上,并使用df$Year作为geom_line()color=美学时,请观察输出

代码语言:javascript
复制
ggplot(df, aes(Date, Raw.Conc)) + geom_line(aes(color=Year))

据我所知,这不是你想要的。我们实际上需要删除日期,只绘制月/日。也许有一种优雅的方式可以做到这一点。但在这里,我将破解一个解决方案,基本上将所有日期放在同一年,这样它们就会像在同一年一样被绘制出来(这是您想要的行为)。请注意以下代码:

代码语言:javascript
复制
# create character vector of "mm-dd"
df$Date.axis <- paste0(month(df$Date),'-',day(df$Date))
# turn that into a class(Date)
df$Date.axis <- as.Date(df$Date.axis, format='%m-%d')

如果你查看df$Date.axis,你会看到它包含了所有这些项目的当前年份(2020),但它可以满足我们的目的。我们现在可以绘制图形,但是使用scale_x_date()来控制x轴的标签,这样我们就只包含月份(忽略年份)。

代码语言:javascript
复制
ggplot(df, aes(x=Date.axis, y=Raw.Conc)) + geom_line(aes(color=Year)) +
  scale_x_date(date_labels = '%b')

改变外观和标签以获得你想要的图表,但这是一个通用的方法,应该适用于你想要做的事情。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62293561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档