【问题标题】:Problems with creating daily mean with many missing values创建具有许多缺失值的每日平均值的问题
【发布时间】:2020-01-26 13:10:17
【问题描述】:

我创建了这个数据框,它对我的​​数据非常有代表性,抱歉代码太长了。

library(lubridate)

datelist = seq(ymd_hms('1980-01-01 00:00:00'),ymd_hms('1980-07-01 00:00:00'), by = '60 mins')

df = data.frame(replicate(2,sample(0:130,4000,rep=TRUE)))
nbr_missing<-1000
y<-data.frame(row=sample(nrow(df),size = nbr_missing,replace = T),
              col=sample(ncol(df),size = nbr_missing,replace = T))

y<-y[!duplicated(y),]
df[as.matrix(y)]<-NA

df2 = data.frame(replicate(2,sample(0:130,369,rep=TRUE)))
nbr_missing<-500
xy<-data.frame(row=sample(nrow(df2),size = nbr_missing,replace = T),
               col=sample(ncol(df2),size = nbr_missing,replace = T))

xy<-xy[!duplicated(xy),]
df2[as.matrix(xy)]<-NA

fill1 = data.frame(matrix(NA, nrow = 4000, ncol = 2))
fill2 = data.frame(matrix(NA, nrow = 369, ncol = 2))

df_new1 = rbind(df, fill2)
df_new2 = rbind(fill1, df2)
df_new = cbind(df_new1, df_new2)

testframe = as.data.frame(cbind(datelist,df_new))
colnames(testframe) = c("Date", "ABC", "DEF", "GHI", "JKL")

我在计算每日平均值时遇到问题。我多次将此代码与其他数据一起使用,它总是很好用。但在这里它似乎给了我错误的结果。知道为什么以及如何解决这个问题吗?

library(dplyr)
testframe1 = testframe %>%
  group_by(group = gl(n()/24, 24)) %>%
  summarise_at(-1, mean, na.rm = TRUE)

例如列 JKL,它在第一天的每小时数据中只包含 NA,但是当我创建平均值时,它给了我一个数字而不是 NA!

这是我使用此命令时得到的示例。

Hourly data

Wrong result

【问题讨论】:

  • 似乎您在某些组中只有NAs,因此平均值为NaN
  • 那不是我的问题。例如列 JKL,它在第一天的每小时数据中只包含 NA,但是当我创建平均值时,它显示的是 84 而不是 NA!
  • 我无法重现此错误。您能否开始一个新的 R 会话,从头到尾运行代码并发布——如果错误仍然存​​在——观察到的(和期望的)输出?
  • 你能再看看我的帖子吗?我添加了一些我的问题的图片。当我重新启动以及使用另一台计算机时会发生这种情况。
  • 我坚信 mean()summarise() 在这里可以正常工作。错误出现在数据或分组中。组的大小是否正确(尝试tally())?或者试试testframe %&gt;% group_by(as.Date(Date)) %&gt;% tally()

标签: r date dplyr mean lubridate


【解决方案1】:

我不确定dplyr 代码出了什么问题,您可以使用by() 方法和colMeans()

res <- do.call(rbind, by(testframe[-1], as.Date(testframe1$Date), colMeans, na.rm=TRUE))
head(res)
#                 ABC      DEF GHI JKL
# 1980-01-01 74.25000 67.91304 NaN NaN
# 1980-01-02 52.70833 55.33333 NaN NaN
# 1980-01-03 65.37500 79.10000 NaN NaN
# 1980-01-04 48.61905 62.91667 NaN NaN
# 1980-01-05 62.34783 61.40909 NaN NaN
# 1980-01-06 80.38095 64.68182 NaN NaN

"group" 你可以只是cbind()

res2 <- cbind(group=1:nrow(res), res)
head(res2)
#            group      ABC      DEF GHI JKL
# 1980-01-01     1 74.25000 67.91304 NaN NaN
# 1980-01-02     2 52.70833 55.33333 NaN NaN
# 1980-01-03     3 65.37500 79.10000 NaN NaN
# 1980-01-04     4 48.61905 62.91667 NaN NaN
# 1980-01-05     5 62.34783 61.40909 NaN NaN
# 1980-01-06     6 80.38095 64.68182 NaN NaN

【讨论】:

    猜你喜欢
    • 2017-01-03
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    相关资源
    最近更新 更多