2017-01-31 13 views
2

私は既にいくつかの統計を行っていますが、私は全く新しいです。
私はチェックしたいいくつかのセンサーの読みを持っています。これについては、各センサーの前と後の3分間の平均を比較したいと思います。私は道をグループ化してデータセットを結合することによりSQLであることがわかっているグループ化された行の値を比較するR

time sensor reading mean 
... 
10:05  A  86.7 43.8 
10:05  B  87.6 51.36666667 
... 

:べきでは次のようになります10:05の結果を得るために

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 


私のデータは次のようになります、フィルタリングされた後、それ自体が集約された形になります。しかし、私はここでSQLを避けようとしており、集約、サブセット、およびループの機能については触れていません。しかし、何も動作していないようです。

私は主題を尋ねましたが、間違った質問をしたり、答えが見つからなかったりします。それとも、問題は簡単なので、私は重要な教訓を見逃してしまった。

+1

提供された例に基づいて期待される出力をすべて表示してください。 'rollmean'は' zoo'からチェックできます – akrun

答えて

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 
関連する問題