私は、大きく以下のdata.frameを持っている:整然としたデータの行間の差異のためのユニバーサル機能?
df <- structure(list(WK = c("W212015", "W212015", "W222015", "W222015",
"W232015", "W232015", "W372016", "W372016", "W382016", "W382016",
"W392016", "W392016"), YEAR = c(2015, 2015, 2015, 2015, 2015,
2015, 2016, 2016, 2016, 2016, 2016, 2016), SEM = c("W21", "W21",
"W22", "W22", "W23", "W23", "W37", "W37", "W38", "W38", "W39",
"W39"), DEPTO = c("FARMA", "NO FARMA", "FARMA", "NO FARMA", "FARMA",
"NO FARMA", "FARMA", "NO FARMA", "FARMA", "NO FARMA", "FARMA",
"NO FARMA"), UNIDADES = c(1010, 1252, 1354, 1275, 1411, 1171,
1057, 1362, 1435, 1120, 1451, 1140), VENTAS = c(128270, 172776,
173312, 204000, 189074, 165111, 130011, 226092, 231035, 181440,
220552, 197220)), .Names = c("WK", "YEAR", "SEM", "DEPTO", "UNIDADES",
"VENTAS"), class = "data.frame", row.names = c(NA, -12L))
head(df)
WK YEAR SEM DEPTO UNIDADES VENTAS
1 W212015 2015 W21 FARMA 1010 128270
2 W212015 2015 W21 NO FARMA 1252 172776
3 W222015 2015 W22 FARMA 1354 173312
4 W222015 2015 W22 NO FARMA 1275 204000
5 W232015 2015 W23 FARMA 1411 189074
6 W232015 2015 W23 NO FARMA 1171 165111
通常推奨されるように、データは、きちんと形式です。しかし、私は年々の変化を計算しようとしているときに、いくつかの問題にぶち当たっています(t1/t0-1として計算されます)。
望ましい結果は、このようなものになるだろう。だから、
res <- structure(list(DEPTO = c("FARMA", "FARMA", "FARMA", "FARMA",
"FARMA", "FARMA", "FARMA", "FARMA", "FARMA", "FARMA", "FARMA",
"FARMA", "FARMA", "FARMA", "FARMA", "FARMA", "FARMA", "FARMA",
"FARMA", "NO FARMA", "NO FARMA", "NO FARMA", "NO FARMA", "NO FARMA",
"NO FARMA", "NO FARMA", "NO FARMA", "NO FARMA", "NO FARMA", "NO FARMA",
"NO FARMA", "NO FARMA", "NO FARMA", "NO FARMA", "NO FARMA", "NO FARMA",
"NO FARMA", "NO FARMA"), SEM = c("W21", "W22", "W23", "W24",
"W25", "W26", "W27", "W28", "W29", "W30", "W31", "W32", "W33",
"W34", "W35", "W36", "W37", "W38", "W39", "W21", "W22", "W23",
"W24", "W25", "W26", "W27", "W28", "W29", "W30", "W31", "W32",
"W33", "W34", "W35", "W36", "W37", "W38", "W39"), YEAR = c(2016,
2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016,
2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016,
2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016,
2016, 2016, 2016, 2016), YOYDIFF = c(0.103960396039604, -0.231166912850812,
0.0276399716513112, -0.0818120351588911, 0.0528169014084507,
0.128721541155867, -0.105511811023622, -0.227333333333333, -0.103495544893763,
0.017304189435337, -0.0495652173913044, -0.239972807613868, -0.258199581297976,
-0.204038997214485, 0.281081081081081, -0.255927475592748, -0.0130718954248366,
-0.0231449965963241, 0.4169921875, 0.0511182108626198, -0.167058823529412,
-0.0341588385994877, 0.00649953574744666, 0.05859375, 0.10594512195122,
0.0839469808541973, 0.250877192982456, 0.233502538071066, 0.0282738095238095,
-0.0850077279752705, 0.103135313531353, 0.121684867394696, -0.0892448512585813,
0.137738853503185, -0.489478114478115, NA, -0.206236711552091,
-0.105180533751962)), .Names = c("DEPTO", "SEM", "YEAR", "YOYDIFF"
), row.names = c(NA, 38L), class = "data.frame")
head(res)
DEPTO SEM YEAR YOYDIFF
1 FARMA W21 2016 0.10396040
2 FARMA W22 2016 -0.23116691
3 FARMA W23 2016 0.02763997
4 FARMA W24 2016 -0.08181204
5 FARMA W25 2016 0.05281690
6 FARMA W26 2016 0.12872154
、私は週(SEM)によってグループ化変数(DEPTO)で前年同期をしました。
通常、私はdcast
または何らかのフィルタリングとdplyr
とinner_joins
の組み合わせでこれを行うだろうが、私はスピードの問題に実行していることだし、それは実際にそれがあまりにも非効率だシンプルなため、このすべてをやっているように思えます計算。
これをスピードアップしてより直観的にするための「普遍的な」機能やパッケージはありますか?私は誰もが超高速のdata.table
またはこれに類するものを使用してののいろいろな結合と操作を行わずに誰かがこの問題に取り組んでいるかどうかを知りたいと思っています。
UPDATE
結果(YOYDIFF)はDEPTO = "FARMA" とYEAR = "2016" とSEM = "W21" はUNIDADESここDEPTOで割った変数 UNIDADESを分割することにより、例えば得られます= "FARMA" とYEAR = "2015" とSEM = "W21"、最後に1
UPDATE 2
df
ちょうど構造を示すために非常に最小限の例であり、を差し引きますは、これらの計算の一部をExcelで実行した結果です。 (
SEM DEPTO YOYDIFF
1: W21 FARMA 1.0465347
2: W21 NO FARMA 1.0878594
3: W22 FARMA 1.0598227
4: W22 NO FARMA 0.8784314
5: W23 FARMA 1.0283487
6: W23 NO FARMA 0.9735269
をデータセットの開始:ただし、元のデータは、多分それはあなたが後にしている正確に何ではないのですが、ここで私の推測だないすべてdf
あなたは何を試しましたか?どの変数を使って 'YOYDIFF'を計算しますか? – Jaap
@ProcrastinatusMaximus私は実際にExcelを最小限の例として使用しました。変数はUNIDADES – eflores89
です。 'res'で' W21'に '0.10396040'を得るための手順を表示できますか? – Sotos