【问题标题】:Functions with Arrays in RR中带有数组的函数
【发布时间】:2011-08-16 15:01:04
【问题描述】:

假设我有过去 20 年的最高温度数据。我的数据框有一列代表月、日、年和 MAX_C(温度数据)。我想计算从一年的 6 月 31 日到前一年的 7 月 1 日的平均(和标准偏差和范围)最高温度(即从 1991 年 7 月 1 日到 1992 年 6 月 31 日的平均最高每日温度)。有没有有效的方法来做到这一点?

到目前为止,我的方法是创建一个数组:

maxt.prev12<-tapply(maxt$MAX_C,INDEX=list(maxt$month,maxt$day,maxt$year),mean)

我将 mean 放入函数中,因为 tapply 不会在 INDEX 之后生成没有函数的数组,但 mean 实际上并没有在这里计算任何东西。然后我在考虑尝试从一个矩阵(即 1992 年)中取 1 月到 6 月,从前面的矩阵(即 1991 年)中取 7 月到 12 月,然后计算平均值。我不完全确定如何做那部分,但是,在 R

中必须有一种更有效的方法来执行这些计算

编辑 这是一个简单的样本数据集

maxt            
day month   year    MAX_C
1   1       1990    29
1   2       1990    28
1   3       1990    32
1   4       1990    26
1   5       1990    24
1   6       1990    32
1   7       1990    30
1   8       1990    28
1   9       1990    28
1   10      1990    24
1   11      1990    30
1   12      1990    30
1   1       1991    25
1   2       1991    26
1   3       1991    28
1   4       1991    25
1   5       1991    24
1   6       1991    32
1   7       1991    26
1   8       1991    32
1   9       1991    26
1   10      1991    26
1   11      1991    27
1   12      1991    26
1   1       1992    27
1   2       1992    25
1   3       1992    29
1   4       1992    32
1   5       1992    27
1   6       1992    27
1   7       1992    24
1   8       1992    25
1   9       1992    28
1   10      1992    26
1   11      1992    31
1   12      1992    27

【问题讨论】:

  • 样本数据会很有帮助。使用dput(myData)
  • dput 很好,因为回复您帖子的人不必重新导入数据(例如将 DATE 列导入 POSIX*)。
  • 抱歉含糊不清。如果您的数据集名为 maxt,则可以在 R 控制台中运行 dput(maxt)。复制该命令的输出并将其粘贴到您的问题中。这将允许其他人在我们的 R 会话中重新创建数据集。需要明确的是 - 这将是您的数据集的精确副本,因此如果它是不应该共享的敏感数据 - 然后制作一些说明问题的虚拟数据。

标签: arrays r


【解决方案1】:

我将创建一个“指标年”列,如果月份在 7 月至 12 月,则等于年,但在 1 月至 6 月时等于年 1。

编辑月份参考,因为它是数字而不是字符:

> maxt$year2 <- maxt$year
> maxt[ maxt$month %in% 1:6, "year2"] <- 
+                         maxt[ maxt$month %in% 1:6, "year"] -1
> # month.name is a 12 element constant vector in all versions of R
> # check that it matches the spellings of your months
> 
> mean_by_year <- tapply(maxt$MAX_C, maxt$year2, mean, na.rm=TRUE)
> mean_by_year
    1989     1990     1991     1992 
28.50000 27.50000 27.50000 26.83333 

如果您想更改标签以使其反映非日历年派生:

> names(mean_by_year) <- paste(substr(names(mean_by_year),3,4),
+                       as.character( as.numeric(substr(names(mean_by_year),3,4))+1), 
                               sep="_")
> mean_by_year
   89_90    90_91    91_92    92_93 
28.50000 27.50000 27.50000 26.83333 

虽然我不认为在千禧年之际会完全正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 2018-10-23
    • 2021-04-26
    • 2020-07-01
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多