【问题标题】:R Using cut function on dates defined as Number and format of the breaksR在定义为中断数和格式的日期上使用剪切函数
【发布时间】:2016-10-08 00:39:15
【问题描述】:

我有一个包含日期和运行时间的数据框

DF  = data.frame(Year =  c(1800,1892,1910,2000,2004),Runtimes=c(80,10,15,10,30))
DF

  Year Runtimes
  1 1800       80
  2 1892       10
  3 1910       15
  4 2000       10
  5 2004       30

我正在使用 CUT 根据我拥有的年份范围创建 10 个休息时间。然后在 ggplot 中绘制这个频率分布。我注意到的是,当我进行 CUT 时,由于它被定义为 NUM,所以 year 的值以 NUMBER 形式表示,而不像 4-CHAR 年份。

有没有办法以更易读的格式(如 [1890,1900)而不是数字格式保存年份,以便信息更易读?

这是我一直在玩的代码:

yr_bins = seq(1800,2010,10)
rt_yr = cut(yr,breaks=yr_bins,right=FALSE)
yr_freq_table = transform(table(rt_yr))
yr_freq_table
ggplot(yr_freq_table) + 
      geom_bar(aes(x=rt_yr,y=Freq), fill="lightblue",color="lightslategray",
     position="stack",stat="identity",ylab("Count Year (mins)") + 
     scale_x_discrete(drop=F) + theme(axis.text.x=element_text(angle=90,   
     vjust=.5, hjust=1)) + ggtitle("Runtime Distribution")   

示例数据如下:

             rt_yr Freq

1   [1.8e+03,1.81e+03)    1
2  [1.81e+03,1.82e+03)    0
3  [1.82e+03,1.83e+03)    0

更新:我要解决的问题是能够在 ggplot 中表示信息,其中 rt_yr 不是数字,而是在 10 的范围内

【问题讨论】:

    标签: r date ggplot2


    【解决方案1】:

    您可以在cut 函数中使用dig.lab 参数来防止科学记数法。例如:

    rt_yr = cut(DF$Year, breaks=yr_bins, right=FALSE, dig.lab=4)
    
    ggplot(yr_freq_table) + 
      geom_bar(aes(x=rt_yr, y=Freq), fill="lightblue", color="lightslategray", 
               stat="identity") +
      labs(y="Count Year (mins)") + 
      scale_x_discrete(drop=F) + 
      theme(axis.text.x=element_text(angle=90, vjust=.5, hjust=1)) + 
      ggtitle("Runtime Distribution")
    

    如果您希望以特定方式格式化标签,您也可以使用labels 参数自行设置标签。例如,假设我们更喜欢连字符分隔符而不是逗号:

    rt_yr = cut(DF$Year,breaks=yr_bins, 
            labels=paste0("[", yr_bins[-length(yr_bins)], "-", yr_bins[-1], ")"),
            right=FALSE)
    

    【讨论】:

      【解决方案2】:

      我喜欢用这个方法:

      yr_freq_table$bottom <- 
          as.numeric(gsub("[[](.*),(.*)[)]", "\\1", yr_freq_table$rt_yr))
      
      yr_freq_table$top <- 
          as.numeric(gsub("[[](.*),(.*)[)]", "\\2", yr_freq_table$rt_yr))
      
      head(yr_freq_table)
      
                      rt_yr Freq bottom  top
      1  [1.8e+03,1.81e+03)    1   1800 1810
      2 [1.81e+03,1.82e+03)    0   1810 1820
      3 [1.82e+03,1.83e+03)    0   1820 1830
      4 [1.83e+03,1.84e+03)    0   1830 1840
      5 [1.84e+03,1.85e+03)    0   1840 1850
      6 [1.85e+03,1.86e+03)    0   1850 1860
      

      【讨论】:

      • 我遇到的问题是,即使在将新字段格式化为 range_yr 之后,我也无法将新字段的行为与 rt_yr 字段相同。所以图表仍然显示 rt_yr
      猜你喜欢
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 2016-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多