私は、各列に複数の個人からのデータが含まれているデータフレーム内の複数の列にローリング平均を適用しようとしていました。私はRcppRollパッケージとlapplyからroll_meanを使って成功しました。以下に、ダミーのデータフレームとその出力を使用した例を示します。Rでroll_meanを使用する場合のリサイクルを避けるには?
x <- rnorm(20,1);
y <- rnorm(20,2);
z <- rnorm(20,3);
ID <- rep(1:2, each=10);
mydf <- data.frame(ID, x, y, z);
vars <- c("x", "y", "z");
setDT(mydf)[, paste0(vars, "_", "mean") := lapply(.SD, function(x) roll_mean(x, n=3, na.rm = TRUE)), .SDcols = vars, by = ID]
mydf
ID x y z x_mean y_mean z_mean
1: 1 0.34457704 1.9580361 2.6458335 1.2515642 1.8307447 2.569645
2: 1 1.41839352 2.0697324 1.8495358 1.7012511 1.7248261 2.988908
3: 1 1.99172192 1.4644657 3.2135652 1.8455087 1.7165419 3.184736
4: 1 1.69363783 1.6402801 3.9036227 1.5002658 2.1512764 3.289555
5: 1 1.85116646 2.0448798 2.4370206 0.9775842 3.1215589 2.563110
6: 1 0.95599300 2.7686692 3.5280206 0.8477701 3.4576141 3.106095
7: 1 0.12559300 4.5511275 1.7242892 0.9450234 3.5134499 3.020176
8: 1 1.46172438 3.0530454 4.0659766 0.9080677 3.0100022 3.371839
9: 1 1.24775283 2.9361768 3.2702614 1.2515642 1.8307447 2.569645
10: 1 0.01472603 3.0407845 2.7792776 1.7012511 1.7248261 2.988908
11: 2 -0.91146047 2.5898074 2.0328348 0.4314443 1.2688530 2.477879
12: 2 0.48183559 1.8230335 2.6910075 1.2689767 0.9650435 2.544006
13: 2 1.72395769 -0.6062819 2.7097949 0.8747931 1.2273766 1.974265
14: 2 1.60113680 1.6783790 2.2312143 0.2579207 1.6945497 2.233321
15: 2 -0.70071522 2.6100328 0.9817857 0.1162224 2.0928536 2.606608
16: 2 -0.12665946 0.7952374 3.4869635 1.3884888 2.1063817 2.986786
17: 2 1.17604187 2.8732906 3.3510742 2.0557599 2.2701173 3.178248
18: 2 3.11608400 2.6506171 2.1223190 1.5553274 2.3987061 3.015501
19: 2 1.87515393 1.2864441 4.0613513 0.4314443 1.2688530 2.477879
20: 2 -0.32525560 3.2590570 2.8628313 1.2689767 0.9650435 2.544006
あなたは出力テーブル(mydf)からわかるように、平均パラメータがlapply文の一部として作成されている、とローリング手段は、個々のIDに対して計算されています。しかし、roll_mean関数は個々のIDごとに10個の生の値から8個の値を生成するため、ローリング平均関数はデータフレームを満たすために結果をリサイクルしています。リサイクルを使用して各IDの最後の2行を記入しています。 私の実際のデータは時系列データであり、私は結果をリサイクルしたくありません。私は、生のx値を、x_mean列の先頭に、3ポイントのローリング平均を生成するのに十分な生データがあるところまで追加することによってリサイクルしないようにします。
私はroll_meanやそれに類する機能のリサイクルを避けるための投稿を(SOとGoogleで)検索してみました。
roll_mean関数でリサイクルするのを避けるために私の例で最初の2行を埋める方法を知っている人はいますか?
ありがとうございました。
'RcppRoll :: roll_mean()'には 'fill'引数が必要です。そこには' NA'を使用し、後で値をコピーします。 'x'、' y'、 'z'の各列にあります。 –