参数不是数字或逻辑,函数rollappy后跟强制引入的NAs

参数不是数字或逻辑,函数rollappy后跟强制引入的NAs,r,dataframe,aggregate,coercion,rollapply,R,Dataframe,Aggregate,Coercion,Rollapply,我试图计算我的数据框中每3个观测值的平均值,这是基于10分钟的数据,我试图将其平均到半小时。我的数据如下所示: Date Value 2017-09-20 09:19:59 96.510 2017-09-20 09:30:00 113.290 2017-09-20 09:40:00 128.370 2017-09-20 09:50:00 128.620 2017-09-20 10:00:00 94.080 2017-09-20 10:10:00 208.150 2

我试图计算我的数据框中每3个观测值的平均值,这是基于10分钟的数据,我试图将其平均到半小时。我的数据如下所示:

    Date             Value
2017-09-20 09:19:59 96.510
2017-09-20 09:30:00 113.290
2017-09-20 09:40:00 128.370
2017-09-20 09:50:00 128.620
2017-09-20 10:00:00 94.080
2017-09-20 10:10:00 208.150
2017-09-20 10:20:00 178.820
2017-09-20 10:30:00 208.440
2017-09-20 10:40:00 285.490
2017-09-20 10:49:59 305.020
我首先尝试使用zoo软件包
library(zoo)
中的函数
rollapply
计算平均值,方法如下:

means <- rollapply(df, by=3, 3, FUN=mean)
我得到:

转换时间出错:格式h:m:s在中可能不正确 添加:警告消息:转换时间(时间,fmt):NAs 强迫引入


我在这一点上感到绝望,我很抱歉在这里问你。也许我的数据有问题,因为它是第一个xlxs文件,我将奇怪的excel时间转换为R中的日期,但仍然。。。我想知道,因为有些日期的结尾是:59秒。如果有帮助的话,我也可以把我的全部数据发布到网上。非常感谢

主要问题是,您试图将
rollappy
用于数据帧,而不是单个列或向量。如果我正确理解了您的目标,以下几点应该可以完成这项工作:

library(dplyr)
library(zoo)

df %>%
  # compute rolling means with a window width of 3
  mutate(means = rollmeanr(Value, k = 3, fill = NA)) %>%
  # decrease the frequency in accordance with the window width
  filter(seq_len(nrow(df)) %% 3 == 0) # or alternatively, slice(seq(3, nrow(df), 3))

# # A tibble: 3 x 3
#   Date                Value means
#   <dttm>              <dbl> <dbl>
# 1 2017-09-20 09:40:00  128.  113.
# 2 2017-09-20 10:10:00  208.  144.
# 3 2017-09-20 10:40:00  285.  224.
库(dplyr)
图书馆(动物园)
df%>%
#计算窗口宽度为3的滚动平均值
变异(平均值=ROLLMENR(值,k=3,填充=NA))%>%
#根据窗口宽度降低频率
过滤器(seq_len(nrow(df))%%3==0)或切片(seq(3,nrow(df),3))
##tibble:3 x 3
#日期值表示
#                  
# 1 2017-09-20 09:40:00  128.  113
# 2 2017-09-20 10:10:00  208.  144
# 3 2017-09-20 10:40:00  285.  224
数据:

df <- structure(list(Date = structure(c(1505917199, 1505917800, 1505918400, 
1505919000, 1505919600, 1505920200, 1505920800, 1505921400, 1505922000, 
1505922599), class = c("POSIXct", "POSIXt"), tzone = ""), Value = c(96.51, 
113.29, 128.37, 128.62, 94.08, 208.15, 178.82, 208.44, 285.49, 
305.02)), row.names = c(NA, -10L), class = c("tbl_df", "tbl", 
"data.frame"))

df问题中的代码将
df
强制为一个矩阵,该矩阵将其转换为字符矩阵,然后它尝试对两列中的每一列进行滚动平均,这两列都是字符

如果您使用时间序列表示法,那么就容易多了。数据帧实际上并不适合表示时间序列,因为您一直在协调时间列和数据,而如果您将其表示为zoo对象,则所有这些都将自动处理

首先将
df
转换为zoo系列,然后运行
rollappyr
。(可选)将其转换回数据帧,或将其保留为zoo对象

library(zoo)

z <- read.zoo(df)
Value <- rollapplyr(z, 3, by = 3, mean)
# fortify.zoo(Value)

最近,我了解了软件包
zoo
,它帮助我找到了我给出的答案。看来动物园比我想象的要强大得多。我们一定会调查细节。回答得好!非常感谢您的解决方案!我有点难过,因为我多次使用zoo来获取另一个数据(最初是csv而不是xlsx,我真的很喜欢这个软件包),但警告仍然存在(它仍然会返回NAs)。我认为数据和我从xlsx到csv时间的时间转换有些奇怪(因为如果我没有弄错的话,xlsx中的天数是从1899年算起的)。无论如何谢谢你!它与你下面的答案一起工作!如果你想得到帮助,你需要提供一个可复制的例子,如果你的数据有问题,你需要弄清楚它是什么,而不是试图通过运行随机代码来避免它。据你所知,这个问题仍然存在。它奏效了!我不知道为什么,但是@G.Grothendieck解决方案没有再次起作用,不过我也很感激他的回答。不过,您的解决方案奏效了,所以感谢您抽出时间。
df <- structure(list(Date = structure(c(1505917199, 1505917800, 1505918400, 
1505919000, 1505919600, 1505920200, 1505920800, 1505921400, 1505922000, 
1505922599), class = c("POSIXct", "POSIXt"), tzone = ""), Value = c(96.51, 
113.29, 128.37, 128.62, 94.08, 208.15, 178.82, 208.44, 285.49, 
305.02)), row.names = c(NA, -10L), class = c("tbl_df", "tbl", 
"data.frame"))
library(zoo)

z <- read.zoo(df)
Value <- rollapplyr(z, 3, by = 3, mean)
# fortify.zoo(Value)
library(magrittr)
library(zoo)

Value <- df %>% read.zoo %>% rollapplyr(3, by = 3, mean)
df <-
structure(list(Date = structure(c(1505913599, 1505914200, 1505914800, 
1505915400, 1505916000, 1505916600, 1505917200, 1505917800, 1505918400, 
1505918999), class = c("POSIXct", "POSIXt"), tzone = ""), Value = c(96.51, 
113.29, 128.37, 128.62, 94.08, 208.15, 178.82, 208.44, 285.49, 
305.02)), class = "data.frame", row.names = c(NA, -10L))