按日期计算数据框列的平均值

5

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

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循环遍历数据框,并为每个匹配的日期提供当天温度的平均值。我已经搜索过了,知道在R中可以使用循环,但是考虑到我对R代码的了解很少,在概念上无法理解这个问题。
我知道可以提取单个列并对其求平均值(即mean(data.frame[[2]])),但我完全不知道如何告诉R将该平均值与第一列中的单个值匹配。
此外,我如何生成每七个日历日的平均值(无论单日有多少条目)?因此,一个七天滚动平均值,即如果我的日期范围从1/1/13开始,我将得到所有在1/1/13和1/7/13之间采取的温度的平均值,然后在1/8/13和1/15/13之间以此类推...
感谢任何帮助我掌握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") 

1
那个 dput 看起来和你的样本数据完全不一样! - A5C1D2H2I1M1N2O1R2T1
“以每7个日历天为单位生成平均值”,您是指“按年周平均”还是“移动7天平均”? - smci
另外,请注意R是区分大小写的。DateDATE不同。 - A5C1D2H2I1M1N2O1R2T1
dput(head(my.dataframe), n=20)的输出或者其他都可以。 - smci
我在解决大小写敏感的问题后得到了我的日均值。 :) 我现在正在考虑滚动平均值... 我会编辑问题,但是@smci,请看看我的评论。 - TheNovice
@TheNovice,那实际上是完全不同的问题,但我的建议仍然是:看一下“xts”包。 - A5C1D2H2I1M1N2O1R2T1
2个回答

9
以下是几个选项:
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等,这些函数将使您方便地聚合数据。


谢谢您周到的回复。作为一个完全的新手,我不确定如何处理这个错误,但是当我尝试应用您的解决方案时,它经常出现:Error in eval(expr, envir, enclos) : object 'Date' not found除了导入CSV之外,我是否需要对我的列做其他事情?在R Studio中,它看起来已经很好地识别了标题,但是... - TheNovice
@TheNovice,请编辑您的问题,包括dput(head(your.actual.data.frame.name))的输出。它看起来像一个带有很多内容的structure(....),而不是....。发布这个将有助于我们更好地进行故障排除。 - A5C1D2H2I1M1N2O1R2T1
这是很多输出。 :) 我会把它上传。 - TheNovice
这有点尴尬,但似乎 R 可能是区分大小写的。哎呀。我有我的每日温度平均值。有什么想法如何进行七天滚动平均? - TheNovice

3
library(plyr)

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

这是 Split-Apply-Combine 范例的简单示例。

第一种选择:就像 Ananda Mahto 所提到的,dplyr 包是 plyr 的高性能重写版。他展示了语法。

第二种选择: aggregate() 也是功能等同的,只不过比 plyr/dplyr 少了一些花哨的东西。


'generate average for every 7 calendar days':您是指 '按每周计算平均值',还是指 '移动的 7 天平均值(前/后/中心)'


好的,简明扼要的回答!楼主:如果你要遍历数据框架,那么你可能还想更全面地探索plyr包——它非常实用。 - user3471268
谢谢@smci的回答,我已经下载了plyr。我可能需要添加更具体的数据,因为当我尝试您的代码时,我会收到以下错误:Error in unique.default(x) : unique()仅适用于向量有什么想法吗? - TheNovice
我已经下载了它。现在我遇到了以下错误 - 在eval(expr, envir, enclos)中出错:找不到对象'Date'。对我来说,这意味着我需要对我的列进行更多的操作,而不仅仅是导入我的CSV文件? - TheNovice
你正在运行@AnandaMahto的示例dplyr代码,对吗?如果是,请在原始问题上方作为补充附加您正在运行但无法正常工作的代码,而不是在评论中添加。 - smci
@smci - 我的意思是移动平均。滚动平均。因此,如果我的数据从2013年1月1日开始,我将对所有温度进行平均,直到2013年1月7日...然后我的下一个平均值将在2013年1月8日至1月15日范围内,依此类推... - TheNovice
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接