比较R

时间:2017-01-31 09:42:14

标签: r time rows mean

我已经完成了一些统计数据,但我对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,并使用聚合,子集和循环函数进行修改。但似乎没有任何效果。

我已经搜索了这个主题,但要么我提出错误的问题,要么找不到答案。或者问题很简单,我错过了重要的一课。

1 个答案:

答案 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