-2

固定間隔(例:2)の座標(列1)の値(列2)の平均を計算したい。ただし、値を持つ座標の数は可変です。ウィンドウのサイズもいろいろ試してみたいです。

データ例(タブ区切り)

2  3
2  4
2  5
3  1
4  2
5  1
5  2
6  8

サイズ 2 のウィンドウの望ましい出力 (2 つの X 値ごとに移動します)

x  mean  window
2  3.25  2-3
3  3.25  2-3
4  1.66  4-5
5  1.66  4-5
6  8     6-7

お時間をいただきありがとうございます。

4

2 に答える 2

5

どうぞ:

test <- data.frame(one=c(2,2,2,3,4,5,5,6),two=c(3,4,5,1,2,1,2,8))
window.size <- 2
test$window.mean <- ave(
                          test$two,
                          findInterval(
                            test$one, 
                            seq(min(test$one),max(test$one),window.size)
                          )
                        )
aggregate(window.mean ~ one, data=test, FUN=head, 1)

  one window.mean
1   2    3.250000
2   3    3.250000
3   4    1.666667
4   5    1.666667
5   6    8.000000

これがどのように機能するかを説明するには:

この例で 2 のウィンドウを使用していくつかのカット ポイントを次のように定義するとします。

> seq(min(test$one),max(test$one),2)
[1] 2 4 6

次にfindInterval、定義されたカット ポイント間のグループにラベルを付けるだけです。

> findInterval(test$one,seq(min(test$one),max(test$one),2))
[1] 1 1 1 1 2 2 2 3
> test$one
[1] 2 2 2 3 4 5 5 6

ave2 番目の引数で定義されたグループ内の最初の引数の平均を計算するだけです。したがって、 のグループfindIntervalと の値を使用するこの例ではtest$two、次のようになります。

#groups 
[1] 1 1 1 1 2 2 2 3
#values
[1] 3 4 5 1 2 1 2 8

mean(c(3,4,5,1)) = 3.25
mean(c(2,1,2))   = 1.66
mean(c(8))       = 8
于 2013-06-28T01:20:49.417 に答える
3

ここで、構文 sugardata.tableを使用して解決策findIntervalを示します。data.table

library(data.table)
DT <- as.data.table(dat)
window.size <- 2
DT[, m:= mean(V2), findInterval(V1, seq(min(V1),max(V1),window.size))]
   V1 V2        m
1:  2  3 3.250000
2:  2  4 3.250000
3:  2  5 3.250000
4:  3  1 3.250000
5:  4  2 1.666667
6:  5  1 1.666667
7:  5  2 1.666667
8:  6  8 8.000000

アイデア: 新しいグループ化変数 (data.table の一部) を使用して作成し、この新しいグループ化変数に従って座標 yfindIntervalを計算します。mean

結果を編集して集計します。

DT[, list(unique(V1),value = mean(V2)),
   findInterval(V1, seq(min(V1),max(V1),window.size))]

   findInterval V1    value
1:            1  2 3.250000
2:            1  3 3.250000
3:            2  4 1.666667
4:            2  5 1.666667
5:            3  6 8.000000
于 2013-06-28T01:41:35.613 に答える