【问题标题】:Need help in grouping rows by year and differentiating months在按年份分组行和区分月份时需要帮助
【发布时间】:2020-12-25 09:53:36
【问题描述】:

我有一个如下所示的数据框:

数据框:

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


    【解决方案1】:

    我建议采用下一种方法来格式化您的数据,并完成年度值。您的数据(我已将您包含的输出定义为 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()
    

    输出:

    【讨论】:

    • 成功了!谢谢!我试图使用不同的列绘制多个图表,但我似乎无法使用相同的数据格式链接多个 ggplot。每次我想使用格式化数据绘制图表时,我是否必须重复代码?
    • 我想我的问题是,我是否有办法创建一个不同的数据框,更新后的格式可以在以下代码中使用
    • @Lucas 如果您想要多列,则必须将数据重新整形为长。您可以使用来自tidyversepivot_longer()。对于您的问题,您只有一个变量用于日期,而另一个变量用于收入。因此,如果您在清理后有更多变量(例如收入),您可以像 pivot_longer(-date) 那样进行重塑,您将为绘图准备好数据!
    • 谢谢,但我想知道是否有办法将新格式永久分配给数据框,因为它似乎在函数本身之外没有改变?当我打印它时,它仍然是相同的格式
    • @Lucas 我明白你想要什么。试试这个NewDF &lt;- df %&gt;% mutate(Var=ifelse(is.na(as.numeric(Date)),NA,as.numeric(Date))) %&gt;% fill(Var) %&gt;% #filter years in date to exclude big totals filter(is.na(as.numeric(Date))) %&gt;% #Add order to levels mutate(Date=factor(Date,levels = c("jan","feb","mar","apr","may", "jun","jul","aug","sep","oct", "nov","dec"),ordered=T))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    相关资源
    最近更新 更多