我想知道当每秒可能有多个数据点时,是否有一种简单的方法可以对R中前30秒的数据进行平均。
例如,对于32秒时的样本重量,我想要过去30秒内记录的浓度平均值,因此9, 10, 7, ..14,20, 18, 2)
的平均值。对于在31秒时取得的样品重量,我想要在过去30秒内记录的浓度平均值,因此5, 9, 10, 7, .. 14,20, 18)
的平均值。它在技术上不是30次之前测量的滚动平均值,因为每秒可以有多次测量。
我想在R中这样做。
答案 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)
}