【问题标题】:Compute data.frame column averages by date按日期计算 data.frame 列的平均值
【发布时间】:2014-06-04 10:50:21
【问题描述】:

我在 R 中有一个 data.frame,其中一列是日期列表(其中许多是重复的),而另一列是该日期记录的温度。有问题的列看起来像这样(但有几千行和一些其他不必要的列):

Date    |    Temp
-----------------
1/2/13     34.4
1/2/13     36.4
1/2/13     34.3
1/4/13     45.6
1/4/13     33.5
1/5/13     45.2

我需要找到一种获取每日平均温度的方法。所以理想情况下,我可以告诉 R 循环遍历 data.frame 并为每个匹配的日期,给我当天的平均温度。我一直在谷歌搜索,我知道 R 中的循环是可能的,但鉴于我对 R 代码知之甚少,我无法从概念上解决这个问题。

我知道我可以拉出一列并对其进行平均(即mean(data.frame[[2]])),但我完全不知道如何告诉 R 将该平均值与位于第一列中的单个值相匹配。

此外,我如何生成每 7 个日历日的平均值(无论一天有多少条目)?因此,7 天滚动平均值,即如果我的日期范围从 2013 年 1 月 1 日开始,我会得到 13 年 1 月 1 日到 13 年 1 月 7 日之间所有临时时间的平均值,然后在 2013 年 1 月 8 日到 2013 年 1 月 15 日之间……

非常感谢任何帮助我掌握 R 循环的帮助。谢谢!

编辑

这是dput(head(my.dataframe)) 的输出请注意:我编辑了“日期”和“时间戳”,否则它们都会持续数千个条目:

structure(list(RECID = 579:584, SITEID = c(101L, 101L, 101L, 
101L, 101L, 101L), MONTH = c(6L, 6L, 6L, 6L, 6L, 6L), DAY = c(7L, 
7L, 7L, 7L, 7L, 7L), DATE = structure(c(34L, 34L, 34L, 34L, 34L, 
34L), .Label = c("10/1/2013", "10/10/2013", "10/11/2013", "10/12/2013", 
"10/2/2013", "10/3/2013", "10/4/2013", "10/5/2013", "10/6/2013", 
"10/7/2013", "10/8/2013", "10/9/2013", "6/10/2013", "6/11/2013","9/9/2013"), class = "factor"), TIMESTAMP = structure(784:789, .Label = c("10/1/2013 0:00", 
"10/1/2013 1:00", "10/1/2013 10:00", "10/1/2013 11:00", "10/1/2013 12:00", 
"10/1/2013 13:00", "10/1/2013 14:00", "10/1/2013 15:00", "10/1/2013 16:00", 
"10/1/2013 17:00", "10/1/2013 18:00", "10/1/2013 19:00", "10/1/2013 2:00"), class = "factor"), TEMP = c(23.376, 23.376, 23.833, 24.146, 
24.219, 24.05), X.C = c(NA, NA, NA, NA, NA, NA)), .Names = c("RECID", 
"SITEID", "MONTH", "DAY", "DATE", "TIMESTAMP", "TEMP", "X.C"), row.names = c(NA, 
6L), class = "data.frame") 

【问题讨论】:

  • dput 看起来不像您的示例数据!
  • '每 7 个日历日生成平均值':你的意思是 'average-by-week-of-year',或'移动 7 天平均值'
  • 另外,请注意 R 区分大小写。 DateDATE 不同。
  • dput(head(my.dataframe), n=20) 的输出或任何可以的。
  • 在我弄清楚区分大小写的位后,我得到了我的每日平均值。 :) 我现在正在考虑滚动平均值...我会编辑问题,但 @smci,请参阅我对您的评论。

标签: r loops for-loop dataframe average


【解决方案1】:
library(plyr)

ddply(df, .(Date), summarize, daily_mean_Temp = mean(Temp))

这是拆分-应用-组合范例的一个简单示例。

Ananda Mahto 提到的替代方案#1,dplyr 包是对plyr 的更高性能重写。他展示了语法。

备选方案 #2:aggregate() 在功能上也是等效的,只是比plyr/dplyr 有更少的花里胡哨。


另外'每 7 个日历日生成平均值':你的意思是 '平均每年一周',或'移动 7 天平均值(尾随/领先/居中)'

【讨论】:

  • 好,简洁的答案! OP:如果您要遍历数据帧,您可能还想更广泛地探索 plyr 包 - 它非常有用。
  • 感谢@smci 的回答,我继续下载了 plyr。我可能需要添加更具体的数据,因为当我尝试您的代码时出现以下错误:unique.default(x) 中的错误:unique() 仅适用于向量有什么想法吗?
  • 我强烈建议您跳过plyr,直接跳转到dplyr。更简洁的语法,更好的性能,更新的代码,更好的习惯用法,更可扩展。相信我。
  • 我下载了。我现在收到以下错误 - eval(expr, envir, enclos) 中的错误:未找到对象“日期”对我来说,这表明我需要对仅导入 CSV 的列做更多的事情?
  • 您正在运行@AnandaMahto 的示例 dplyr 代码,对吧?如果是,请发布您正在运行但不起作用的代码 - 作为原始问题中的上述附录,而不是 cmets 中的此处。
【解决方案2】:

这里有几个选项:

aggregate(Temp ~ Date, mydf, mean)
#     Date     Temp
# 1 1/2/13 35.03333
# 2 1/4/13 39.55000
# 3 1/5/13 45.20000

library(dplyr)
mydf %.% group_by(Date) %.% summarise(mean(Temp))
# Source: local data frame [3 x 2]
# 
#     Date mean(Temp)
# 1 1/2/13   35.03333
# 2 1/4/13   39.55000
# 3 1/5/13   45.20000

library(data.table)
DT <- data.table(mydf)
DT[, mean(Temp), by = Date]
#      Date       V1
# 1: 1/2/13 35.03333
# 2: 1/4/13 39.55000
# 3: 1/5/13 45.20000

library(xts)
dfX <- xts(mydf$Temp, as.Date(mydf$Date))
apply.daily(dfX, mean)
#             [,1]
# 1-02-13 35.03333
# 1-04-13 39.55000
# 1-05-13 45.20000

由于您正在处理日期,您应该探索xts 包,它可以让您访问apply.dailyapply.weeklyapply.monthly 等功能,让您方便地汇总数据。

【讨论】:

  • 感谢您的周到回复。作为一个完全的新手,我不确定如何处理这个错误,但是当我尝试应用您的解决方案时,它出现了很多: eval 中的错误(expr,envir,enclos):找不到对象“日期”我除了导入 CSV 之外,还需要用我的 cols 做其他事情吗?在 R 工作室中,它看起来可以很好地识别标题但是......
  • @TheNovice,请编辑您的问题以包含dput(head(your.actual.data.frame.name)) 的输出。它看起来像structure(....),里面有很多东西,而不是....。发布这将有助于我们更好地排除故障。
  • 输出量很大。 :) 我会放上去的。
  • 所以,这有点尴尬,但看起来 R 可能区分大小写。哎呀。我有我的每日平均温度。关于如何进行 7 天滚动平均值的任何想法?
猜你喜欢
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 2020-09-23
  • 1970-01-01
  • 2018-08-26
  • 2023-01-19
  • 2013-02-25
相关资源
最近更新 更多