【问题标题】:Working With Years in a Monthly POSIX data set在每月 POSIX 数据集中处理年份
【发布时间】:2016-07-17 05:23:14
【问题描述】:

我使用大阿尔伯克基地区多个气象站的月度气候数据,我以机场数据的这个子集为例,我最终会将相同的过程应用于所有位置。有近 500 个月的数据可用,但我在这里包括了前 30 个月。

> head(ABQ, 30)
                                STATION_NAME       DATE CLDD
9698 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1945-05-01  449
9699 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1945-06-01 1335
9700 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1945-07-01 2330
9701 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1945-08-01 2269
9702 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1945-09-01 1247
9703 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1945-10-01   13
9709 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1946-04-01   62
9710 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1946-05-01  251
9711 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1946-06-01 2097
9712 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1946-07-01 2303
9713 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1946-08-01 1889
9714 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1946-09-01 1111
9715 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1946-10-01   23
9721 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1947-04-01    1
9722 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1947-05-01  611
9723 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1947-06-01 1273
9724 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1947-07-01 2636
9725 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1947-08-01 1892
9726 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1947-09-01 1265
9727 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1947-10-01  171
9733 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1948-04-01   91
9734 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1948-05-01  642
9735 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1948-06-01 1506
9736 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1948-07-01 2529
9737 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1948-08-01 2186
9738 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1948-09-01 1130
9739 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1948-10-01   13
9745 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1949-04-01   88
9746 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1949-05-01  304
9747 ALBUQUERQUE INTERNATIONAL AIRPORT NM US 1949-06-01 1477

我想调用 ABQ$CLDD 的年度总和并将该值应用于 ggplot()... 类似这样的东西

    CLDD_yr <- apply.yearly(ABQ$DATE, sum(CLDD))
    p <- ggplot(CLDD_yr, aes(YEAR, CLDD_yr)),
         + stat_smooth(method = "lm", formula = y~x + I(x^2), size = 1)

我知道我在调用我认为的数据时犯了一个错误,但我似乎无法解决这个问题。

DATE 列是 POSIX 时间,如此处所示

> class(ABQ$DATE)
[1] "POSIXlt" "POSIXt" 

编辑: 每个 coffienjunkies cmets

也许一个新的 df 是解决这个问题的最佳方法,因为我需要以相同的方式查看多个位置的数据

> stations
      unique(Bernalillo_data$STATION_NAME)
1  ALBUQUERQUE INTERNATIONAL AIRPORT NM US
2            PETROGLYPH NATIONAL MON NM US
3                        SANDIA PARK NM US
4                    ALBUQUERQUE VLY NM US
5           ALBUQUERQUE FOOTHILLS NE NM US
6              SANDIA RANGER STATION NM US
7                       SANDIA CREST NM US
8                 LA MADERA SKI AREA NM US
9                    NETHERWOOD PARK NM US
10                   EXPERIMENT FARM NM US
11                      KIRTLAND AFB NM US

也许新的 DF 应该是这样的

header <-  station_name    Year    CLDD_sum

从长远来看,我认为这将使分析更简单。

【问题讨论】:

  • 为什么不愿意创建一个数据框来总结这些值?无论如何,某些聚合必须在某个时间点发生。
  • @coffeinjunky,我希望能够在整个脚本中继续引用相同的数据以提高可读性。它会被其他人看到......我想我并不完全反对它,我只是想让代码完成这项工作
  • 可以选择创建新列吗?
  • 当然,但这会导致“融化”的情况,对吧?我最好只做一个新的df ...也许你可以提出这个答案..我认为它仍然是相关的,我如何将年度值作为来自YYYY-MM-DD posix时间的调用求和?跨度>
  • new.df &lt;- aggregate(data = ABQ, CLDD ~ DATE$year, sum)

标签: r ggplot2 xts


【解决方案1】:

试试这个,

require(data.table)
setDT(ABQ)
ABQ[, CLDD_yr := sum(CLDD), by = year(DATE)]

# Required because data.table and ggplot don't play nice.
setDF(ABQ)


p <- ggplot(ABQ, aes(YEAR, CLDD_yr)),
  + stat_smooth(method = "lm", formula = y~x + I(x^2), size = 1)

请注意,您必须安装 data.table。请注意,这将为每一行创建摘要统计信息,因此您可能会在 ggplot 中得到几个重叠的点。如果你不想这样,你可以试试,

require(data.table)
setDT(ABQ)
for_plot <- ABQ[, .(CLDD_yr := sum(CLDD)), by = list(year = year(DATE))]

# Required because data.table and ggplot don't play nice.
setDF(for_plot)


p <- ggplot(for_plot, aes(year, CLDD_yr)),
  + stat_smooth(method = "lm", formula = y~x + I(x^2), size = 1)

希望这会有所帮助。

【讨论】:

  • 这是一个很好的解决方案。我正在尝试最小化新包,但这确实有效。谢谢
  • 为方便起见,您可能必须使用data.tabledplyr。出于性能原因,我更喜欢前者,它适用于 xts 对象。
【解决方案2】:

我认为您可以使用许多方法,但在某些时候必须进行一些聚合。这里有两个建议:

library(dplyr)
library(ggplot2)
df$year <- df$DATE$year
df$DATE <- as.POSIXct(df$DATE) # dplyr doesn't play well with POSIXlt
df_yr <- df %>% group_by(year) %>% summarise(cldd_yr = sum(CLDD))

这会产生:

Source: local data frame [5 x 2]

   year cldd_yr
  (chr)   (int)
1  1945    7643
2  1946    7736
3  1947    7849
4  1948    8097
5  1949    1869

您可以与ggplot 结合使用。对于多个站点,只需将站点添加为分组变量。例如,df_yr &lt;- df %&gt;% group_by(year, station) %&gt;% summarise(cldd_yr = sum(CLDD)) 将为您提供所有年份和电台的摘要,前提是您的标识符是如何调用的 station

如果您真的不想使用新的数据框但可以添加列,请尝试

 df <- group_by(df, year) %>% mutate(yr.sum = sum(CLDD))

yr.sum 中,您有年度总和。请注意,此值是重复的,您必须确保 ggplot 正确使用它。不过我建议使用第一种方法,因为它可能更高效、更透明。

【讨论】:

  • 确定..但我有一个关于您的 df$DATE$year 的问题...这部分给我一个错误'类型闭包的对象不是子集'我可以看到你的答案将如何解决我需要的东西,所以我选择了它,我确信我可以到达那里,但我没想到会这样
  • 一个注意事项.. > df_yr % group_by(year, station) %>% summarise(CLDD_yr = sum(CLDD)) 错误:列 'DATE' 的类型不受支持: POSIXlt, POSIXt
  • > library(dplyr) > library(ggplot2) > df df$year df_yr % group_by(year,STATION_NAME) %> % summarise(CLDD_yr = sum(CLDD)) 错误:列 'DATE' 的类型不受支持:POSIXlt, POSIXt
  • 请参阅stackoverflow.com/questions/27828850/… 以获得解释。
猜你喜欢
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 2021-02-12
  • 1970-01-01
相关资源
最近更新 更多