【问题标题】:Average by season using R使用 R 按季节平均
【发布时间】:2018-07-01 03:36:41
【问题描述】:

我有按位置(纬度和经度)的每日数据,我想按季节平均。我想将 1 月至 3 月视为第 1 季、4 月至 6 月的第 2 季、7 月至 9 月的第 3 季和 10 月至 12 月的第 4 季。这是所需的示例数据和输出。

Lat            Long           Date          Value.
30.497478    -87.880258      01/01/2016       10
30.497478    -87.880258      02/02/2016       15
30.497478    -87.880258      02/05/2016       20
33.284928    -85.803608      01/02/2016       10
33.284928    -85.803608      01/03/2016       15
33.284928    -85.803608      01/05/2016       20

输出应该是

Lat              Long         Season      Avg Value
30.497478      -87.880258       1            15

除了均值之外,还想添加中位数和 SD。我已经看到了一些使用 library zoo 和 dplyr 的示例,但在这种情况下无法使用它。希望这里有人可以提供帮助。谢谢。

【问题讨论】:

  • 请将您的代码包装在代码标签{} 按钮中,然后告诉我们。

标签: r average


【解决方案1】:

可能是这样的:

df <- read.table(text = "
                 Lat            Long           Date          Value.
30.497478    -87.880258      01/01/2016       10
                 30.497478    -87.880258      02/02/2016       15
                 30.497478    -87.880258      02/05/2016       20
                 33.284928    -85.803608      01/02/2016       10
                 33.284928    -85.803608      01/03/2016       15
                 33.284928    -85.803608      01/05/2016       20", header = T)


df$Season <- cut(as.numeric(substr(df$Date, 4, 5)), c(1,4,7,10,12), c(1,2,3,4), include.lowest = T)

library(dplyr)
options(pillar.sigfig = 6) # to prevent Lat and Long to be rounded

df %>% 
  group_by(Lat, Long, Season) %>% 
  select(-Date) %>% # since all other variables all grouping vars, just deselect Date
  summarise_all(funs(mean, median, sd))

     Lat     Long Season    mean  median        sd
    <dbl>    <dbl> <fct>    <dbl>   <dbl>     <dbl>
1 30.4975 -87.8803 1      12.5000 12.5000   3.53553
2 30.4975 -87.8803 2      20.0000 20.0000 NaN      
3 33.2849 -85.8036 1      12.5000 12.5000   3.53553
4 33.2849 -85.8036 2      20.0000 20.0000 NaN     

请注意,对于第 2 季,无法给出 sd,因为样本数据中的 Lat 和 Long 的每种组合只有一个值。

【讨论】:

  • 感谢您的回复。日期采用 mm/dd/yyyy 格式。以上都是第 1 季的内容。那你会怎么分呢?
  • 只需执行 substr(X, 1, 2) 而不是 substr(X,4,5)
  • 谢谢我尝试做 substr(X, 1, 2) 并且我收到了强制引入的警告消息 NA。有些在新列中有赛季编号,有些只有 NA。另外,它在 10 月作为第 3 季阅读。
  • 部分问题可能是 1 月到 9 月是 1 到 9,而不是 01 到 09。因此,它只是将 10 月(错误地应该是第 4 季而不是第 3 季)切割到 12 月。有什么建议吗?
  • 我将日期格式化为在 1-9 个月内显示 0,并且我将您的代码从 c(1,4,7,10,12) 修改为 c(1,3,6,9,12 ) 并且效果很好。感谢您的帮助。
猜你喜欢
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 2018-11-17
  • 2023-03-14
  • 2012-04-05
  • 1970-01-01
相关资源
最近更新 更多