R

时间:2016-07-27 13:20:42

标签: r time-series

我想知道当每秒可能有多个数据点时,是否有一种简单的方法可以对R中前30秒的数据进行平均。

enter image description here

例如,对于32秒时的样本重量,我想要过去30秒内记录的浓度平均值,因此9, 10, 7, ..14,20, 18, 2)的平均值。对于在31秒时取得的样品重量,我想要在过去30秒内记录的浓度平均值,因此5, 9, 10, 7, .. 14,20, 18)的平均值。它在技术上不是30次之前测量的滚动平均值,因为每秒可以有多次测量。

我想在R中这样做。

5 个答案:

答案 0 :(得分:1)

1)sqldf 使用下面的DF和3秒将最后三秒数据连接到DF的每一行,然后取平均值:

DF <- data.frame(time = c(1, 2, 2, 3, 4, 5, 6, 7, 8, 10), data = 1:10)

library(sqldf)
sqldf("select a.*, avg(b.data) mean 
       from DF a join DF b on b.time between a.time - 3 and a.time 
       group by a.rowid")

,并提供:

   time data mean
1     1    1  1.0
2     2    2  2.0
3     2    3  2.0
4     3    4  2.5
5     4    5  3.0
6     5    6  4.0
7     6    7  5.5
8     7    8  6.5
9     8    9  7.5
10   10   10  9.0

第一个平均值是平均值(1),它是1,第二个和第三个平均值是平均值(1:3),它是2,第四个平均值是平均值(1:4),即2.5,第五个平均值是平均值(1:5),它是3,第六个平均值是平均值(2:6),它是4,第七个平均值是平均值(3:7),它是5,依此类推。

2)此第二个解决方案不使用任何包。对于DF的每一行,它会在3秒内找到行并获取其数据的平均值:

Mean3 <- function(i) with(DF, mean(data[time <= time[i] & time >= time[i] - 3]))
cbind(DF, mean = sapply(1:nrow(DF), Mean3))

答案 1 :(得分:0)

<a href="#" class="expand"><span class="glyphicon glyphicon-chevron-right"></span></a> <a href="#" class="collapse"><span class="glyphicon glyphicon-chevron-down"></span></a> <div class="content"> Div Content </div> 函数应该可以解决问题。

rollapply

答案 2 :(得分:0)

您可以这样做(假设您的数据存储在名为df的数据框中):

now <- 32
step <- 30
subsetData <- subset(df, time >= (now-step) & time < now)
average <- mean(subsetData$concentration)

如果你想计算更多时间点的平均值,你可以把它放在一个你必须调整now

的循环中

答案 3 :(得分:0)

我的第一个想法是汇总数据,以便值列包含所有值的列表。

test.data <- data.frame(t = 1:50 + rbinom(50, 30, 0.3), y=rnorm(50)) %>% arrange(t)
prep <- test.data %>% group_by(t) %>% summarise(vals = list(y))
wrk <- left_join(data.frame(t=1:max(test.data$t)), prep, by='t')

不幸的是,zoos rollapply无法在这样的data.frame上工作 为了测试我只想使用5行的窗口。 我尝试过命令:rollapply(wrk, 5, function(z) mean(unlist(z)))

但也许其他人可以填写缺失的信息。

答案 4 :(得分:0)

这是完全不同的,它保证了另一个答案。

这应该做你要求的,不需要额外的库。

它只是循环遍历每一行,根据该行的时间过滤,并计算平均值。

不要害怕简单的循环:)

count = 200 # dataset rows
windowTimespan = 30 # timespan of window

# first lets make some data
df = data.frame(
  # 200 random numbers from 0-99
  time = sort(floor(runif(count)*100)),
  concentration = runif(count),
  weight = runif(count)
)

# add placeholder column(s)
df$rollingMeanWeight = NA
df$rollingMeanConcentration = NA

# for each row
for (r in 1:nrow(df)) {
  # get the time in this row
  thisTime = df$time[r]
  # find all the rows within the acceptable timespan
  # note: figure out if you want < vs <=
  thisSubset = df[
    df$time < thisTime &  
    df$time >= thisTime-windowTimespan
  ,]
  # get the mean of the subset
  df$rollingMeanWeight[r] = mean(thisSubset$weight)
  df$rollingMeanConcentration[r] = mean(thisSubset$concentration)
}