通过R将CSV中的每日数据转换为月平均值?

时间:2017-01-31 15:26:17

标签: r csv average data-conversion

我在电子表格中有每日数据,在R中我已将其命名为" df"。数据采用两列X1和X2的简化格式。

X1是格式为01/01/1990 ......等的日期日期

X2只是一个数值

我想做的是将这些每日价值转换为月平均值。

以前我给了以下代码来执行此操作:

library(dplyr)
library(lubridate)

df <- mutate(df, X1 = dmy(X1),Year = year(X1), Month = month(X1))
df <- group_by(df, Month, Year)
df <- summarise(df, result = mean(X2) )

但是,现在当我输入此代码时,我收到了错误

50: In mean.default(structure(c(336L, 220L, 187L, 175L, 193L,  ... :
  argument is not numeric or logical: returning NA

问题似乎与最后一行代码有关;

df <- summarise(df, result = mean(X2) )

有人可以建议如何修复此代码吗?我不确定为什么现在已经停止工作了。或者,如果有另一种方法可以找到月平均值,那将是非常受欢迎的。

2 个答案:

答案 0 :(得分:1)

考虑到您的数据如下所示:

fakedata = data.frame(X1 = c("01/01/1990", "01/02/1991", "02/01/1990"),
                  X2 = c(1, 2, 99), stringsAsFactors = FALSE)

> str(fakedata)
'data.frame':   3 obs. of  2 variables:
 $ X1: chr  "01/01/1990" "01/02/1991" "02/01/1990"
 $ X2: num  1 2 99

并且01中的第一个01/01/1990表示月份,您可以不使用任何额外的包,例如e。 G。

fakedata$months = unlist(Map(function(x) strsplit(x, split="/")[[1]][1], fakedata$X1))
aggregate(fakedata$X2, by=list(fakedata$months), FUN=mean)

另外:不要在df中为任何R命名。它已经是buildin函数的名称,虽然像函数这样的命名值工作得很好,但在语法错误的情况下会导致误导性的错误消息。

答案 1 :(得分:0)

使用data.table和xts,它变得相对容易:(参见@Bernhard'数据帧)

library(data.table)
library(xts)
dtf <- data.table(fakedata)
dtf[, X1 := as.Date(X1)]
xts <- as.xts.data.table(dtf)
z <- aggregate(xts, format(index(xts),"%m"), function(d) c(mean(d)))
z

给出

01 50
02  2