最小值和最大值在r中产生错误的结果

时间:2018-09-29 21:20:58

标签: r

我制作了一个包含年,月,温度,上,下列的数据框

最高和最低是每年的最高温度,最低是最低的

我有两个问题:

首先是为什么对于数据帧末尾的某些值不能正确计算上限和下限,但在数据帧的其余部分都可以正常计算呢?

为什么我在使用ggplot时会出现怪异的轴 数据框是这个

您可以看到2017年的上下波动是错误的

     Year   Month  Temp  upper lower        
1    1880   Jan    -.29  -.29   -.09 
2    1880   Feb    -.18  -.29   -.09
3    1880   Mar    -.11  -.29   -.09
       ......
1655 2017   Nov     .84   .96   1.12
1656 2017   Dec     .88   .96   1.12

代码是:

 newDF <- df %>%
 group_by(Year) %>%
 mutate(upper = max(Temp), # identify max value for month day
       lower = min(Temp) # identify min value for month day
       ) %>% 
 ungroup()

    p <- ggplot(newDF, aes(Month, Temp)) +
    geom_linerange(newDF, mapping=aes(x=Year, ymin=lower, ymax=upper), colour = "wheat2", alpha=.1)
    print(p)

图形看起来不错,但轴混乱了 enter image description here

1 个答案:

答案 0 :(得分:0)

我认为您非常接近-这只是需要调整的第二部分。 ggplot可以将日期字段用作x轴,但是Month字段是文本(并且不包括Year)。在这里,我创建了一个称为date的新列,将它们结合在一起。 lubridate是一个方便的软件包,因为它可以智能地解析日期格式。

# Fake data
library(dplyr)
df <- data_frame(
  Year = rep(1880:2017, each = 12),
  Month = rep(month.abb, times = (2017-1880+1)),
  Temp = rnorm(n = 1656, mean = 0, sd = 1)
)


newDF = df %>%
  # This line adds a date field based on Year and Month
  mutate(date = lubridate::ymd(paste(Year, Month, 1))) %>%
  group_by(Year) %>%
  mutate(upper = max(Temp), # identify max value for month day
         lower = min(Temp), # identify min value for month day
          ) %>% 
  ungroup()

library(ggplot2)
p <- ggplot(newDF, aes(date, Temp)) +
  geom_linerange(newDF, mapping=aes(x=Year, ymin=lower, ymax=upper), colour = "wheat2", alpha=.1)
print(p)