我在电子表格中有每日数据,在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) )
有人可以建议如何修复此代码吗?我不确定为什么现在已经停止工作了。或者,如果有另一种方法可以找到月平均值,那将是非常受欢迎的。
答案 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