我已经完成了一些统计数据,但我对R.完全不熟悉 我有几个传感器的读数,我想检查。为此,我想比较每个传感器之前和之后3分钟的平均值 我的数据看起来像这样:
time sensor reading
10:01 B 86.7
10:01 A 87.6
10:02 A 81.1
10:02 B 32.1
10:03 B 80.0
10:03 A 20.8
10:04 A 35.2
10:04 B 10.0
10:05 B 26.2
10:05 A 59.0
10:06 A 94.7
10:06 B 6.8
10:07 B 50.4
10:07 A 5.0
10:08 A 71.4
10:08 B 83.5
10:09 B 33.3
10:09 A 82.5
对于10:05,结果看起来应该是这样的:
time sensor reading mean
...
10:05 A 86.7 43.8
10:05 B 87.6 51.36666667
...
我知道在SQL中有一种方法可以将数据集与自身的分组,过滤和聚合形式相结合。但我尝试在这里避免使用SQL,并使用聚合,子集和循环函数进行修改。但似乎没有任何效果。
我已经搜索了这个主题,但要么我提出错误的问题,要么找不到答案。或者问题很简单,我错过了重要的一课。
答案 0 :(得分:1)
您可以尝试以下操作。我只使用了基本R函数。也许有时候有点复杂,但你会得到一些结果。希望是正确的。
# change to time format
d$t <- as.POSIXct(d$time, format="%H:%M")
# function to add or substract 3 minutes
mns <- function(m) {
x <- m * 60
return(x)
}
# add columns with 3 minutes previous and after
d$tp <- d$t - mns(3)
d$ta <- d$t + mns(3)
# split the data according the sensors
d1 <- split(d, d$sensor)
# get the results per sensors and an interval of 6 minutes (before and after)
res <- lapply(d1, function(x){
Mean=sapply(1:nrow(x), function(i, y){
mean(y[ y$t[i] > y$tp & y$t[i] < y$ta, "reading"], na.rm = T)
}, x)
cbind.data.frame(time=x[, 1], Mean)
})
# convert to data.frame
do.call(cbind, res)
A.time A.Mean B.time B.Mean
1 10:01 63.16667 10:01 66.26667
2 10:02 56.17500 10:02 52.20000
3 10:03 56.74000 10:03 47.00000
4 10:04 58.16000 10:04 31.02000
5 10:05 42.94000 10:05 34.68000
6 10:06 53.06000 10:06 35.38000
7 10:07 62.52000 10:07 40.04000
8 10:08 63.40000 10:08 43.50000
9 10:09 52.96667 10:09 55.73333