首页 > 解决方案 > 在按年份分组行和区分月份时需要帮助

问题描述

我有一个看起来像这样的数据框:

数据框:

Date    Revenue   
2009      15       
dec       15       
2010      450       
jan       13       
feb       14       
mar       14       
apr       10       
may       10       
jun       31       
jul       99    
aug       43  
sep       87 
oct       32  
nov       54     
dec       43
2011      67

并且以相同的模式持续数年,直到 2019 年。包含年份的行代表该年的总收入。2009 年是唯一一个仅包含一个数据点的年份(12 月)。

数据框来自从 excel 导入的数据透视表,该数据透视表每年对月份进行分组。

每个月与年份在同一列中,不同年份的月份没有区别。我需要绘制一个带有每年每月收入的折线图(即,不同年份的几条线逐月显示收入),但我无法区分不同年份的月份这一事实不允许我这样做。

如何按年制作月份的子组?或者为确定的间隔(即每 12 行)分配一个带有年份的新列,但不包括年份行?

谢谢!

标签: r

解决方案


我建议下一种方法来格式化你的数据,并完成一年的值。您的数据(我已定义为df您包含的输出)具有Date变量具有混合数字和字符值的特征。我添加的代码根据类型创建了一个新变量以提取年份。之后填充缺失的行以完全识别年份组。最后,勾勒出剧情。您只有一个 2009 年的值,因此无法看到,而 2011 年只有一个关于总数的信息。使用您的全部数据,您将拥有所有年份的完整图像。这里有一种tidyverse方法:

library(tidyverse)
#Data
df <- structure(list(Date = c("2009", "dec", "2010", "jan", "feb", 
"mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", 
"dec", "2011"), Revenue = c(15L, 15L, 450L, 13L, 14L, 14L, 10L, 
10L, 31L, 99L, 43L, 87L, 32L, 54L, 43L, 67L)), class = "data.frame", row.names = c(NA, 
-16L))

编码:

#Code
df %>% mutate(Var=ifelse(is.na(as.numeric(Date)),NA,as.numeric(Date))) %>%
  fill(Var) %>%
  #filter years in date to exclude big totals
  filter(is.na(as.numeric(Date))) %>%
  #Add order to levels
  mutate(Date=factor(Date,levels = c("jan","feb","mar","apr","may",
                                     "jun","jul","aug","sep","oct",
                                     "nov","dec"),ordered=T)) %>%
  #Finally plot
  ggplot(aes(x=Date,y=Revenue,group=factor(Var),color=factor(Var)))+
  geom_line()+
  theme_bw()

输出:

在此处输入图像描述


推荐阅读