2017-12-22 9 views
0

私のデータを操作して、現在のアイテムの複数の買い/売りを、買いと売りの2行に減らしました。だから、私のデータフレームは、現在のようになります。アイテムをそれぞれ2行にマージするアイテムの行1と2に固有の計算の行

Market Type `After Fees Collapsed` `AFC Signed` 
<chr> <chr>     <dbl>  <dbl> 
ITEM_1 BUY    0.03220841 -0.03220841 
ITEM_1 SELL    0.03251323 0.03251323 
ITEM_2 BUY    0.05522072 -0.05522072 
ITEM_2 SELL    0.01160392 0.01160392 
ITEM_3 BUY    0.05707432 -0.05707432 
ITEM_3 SELL    0.05759784 0.05759784 
ITEM_4 BUY    0.03221925 -0.03221925 
ITEM_4 SELL    0.03217333 0.03217333 
ITEM_5 BUY    0.05070265 -0.05070265 
ITEM_5 SELL    0.05118556 0.05118556 

AFC署名欄は、単に買いのために-1を乗じた「手数料が崩壊した後」の欄です。これは、以下のコードを実行することでネットの結果を計算することができたためです。しかし、私はこの質問に対する正しい答えで、AFCの署名入りのコラムを廃止し、私の購入行と売却行の値をそのまま使用できると信じています。私は何をしたいのですが(派生(特定の項目のSELL-BUY由来)「正味」の欄で、単一の行にITEM_番号を崩壊し、「%正味」の一つであり

... %>% 
    summarise(Nett = sum(`AFC Signed`) 

特定のITEM(売り買い)/買物から) 「

Market Nett `% Nett` 
ITEM_1 0.03  10% 
ITEM_2 -0.4  -15% 
ITEM_3  1.5 7.33% 
ITEM_4 0.003 2.45% 
ITEM_% -1.468 -4.141% 
+1

コードスニペットの形成にはスペースが無駄です。実行されません... Rコードには使用しないでください。 –

答えて

2

この種のもののための基本的な考え方は、一般的に(dは、データセットである)である

aggregate(`AFC Signed` ~ Market, d, sum) 

しかし、実際にあなた:出力は、このように、以下の(番号が構成されています)のようになります。データモデルを修正する方が良い。

item buy_value sell_value 
... ...  ... 

ではなく

item type value 
id1 buy ... 
id1 sell ... 

その後、あなたは、単にどのように完全性について

d$net_pct = (d$sell_value - d$buy_value)/d$buy_value 

編集を行うことができると思います:あなたのデータフレームがされている必要があります開始からデータフレームを修正する(これはすべて些細なことです):

d = d[order(d$Market),] 
d2 = d[d$Type == 'BUY',] 
d3 = d[d$Type == 'SELL',] 
all(d2$Market == d3$Market) # should be true 
d2$`Sell after Fees Collapsed` = d3$`After Fees Collapsed` 
d2$net = d2$`Sell after Fees Collapsed` - d2$`After Fees Collapsed` 
d2$net_pct = d2$net/d2$`After Fees Collapsed` 
+0

私はそれがformatingを失うことを望んでいないことを理解することができますが、これは本当に答えですね。 –

+0

私はちょうど正しい方法を述べています。高度な醜いハッキングを使用することも、入力データを再フォーマットすることもできます。特に入力データが適切にペア設定されていれば、すべてが簡単になります。また、入力データが適切にペア設定されていない場合は、結果テーブルに容易に識別可能な迷惑メールが挿入されることに注意してください。 –

+0

@ n.caillouより良いデータセットが理想的だと私は理解していますが、これはオンラインソースからエクスポートされたデータセットです。フォーマットの制御がありません – Shawn

2
aggregate(.~Market,dat[1:3],function(x)c(a<-diff(x),a/x[1])) 
    Market Type.M Type.V2 X.AfterFeesCollapsed..M X.AfterFeesCollapsed..V2 
1 ITEM_1  1  1    0.000304820    0.009463988 
2 ITEM_2  1  1   -0.043616800    -0.789862936 
3 ITEM_3  1  1    0.000523520    0.009172602 
4 ITEM_4  1  1   -0.000045920    -0.001425235 
5 ITEM_5  1  1    0.000482910    0.009524354 
+0

余分な列を取り除くことができます – Onyambu

1

(あなたがapperentlyすでに使用している)dplyrとアプローチ:

d %>% 
    group_by(Market) %>% 
    summarise(Nett = After_Fees_Collapsed[Type == 'SELL'] - After_Fees_Collapsed[Type == 'BUY'], 
      pNett = 100 * Nett/After_Fees_Collapsed[Type == 'BUY']) 

います:

# A tibble: 5 x 3 
    Market  Nett  pNett 
    <fctr>  <dbl>  <dbl> 
1 ITEM_1 0.00030482 0.9463988 
2 ITEM_2 -0.04361680 -78.9862936 
3 ITEM_3 0.00052352 0.9172602 
4 ITEM_4 -0.00004592 -0.1425235 
5 ITEM_5 0.00048291 0.9524354 

使用するデータ:

d <- structure(list(Market = c("ITEM_1", "ITEM_1", "ITEM_2", "ITEM_2", "ITEM_3", "ITEM_3", "ITEM_4", "ITEM_4", "ITEM_5", "ITEM_5"), 
        Type = c("BUY", "SELL", "BUY", "SELL", "BUY", "SELL", "BUY", "SELL", "BUY", "SELL"), 
        After_Fees_Collapsed = c(0.03220841, 0.03251323, 0.05522072, 0.01160392, 0.05707432, 0.05759784, 0.03221925, 0.03217333, 0.05070265, 0.05118556), 
        AFC_Signed = c(-0.03220841, 0.03251323, -0.05522072, 0.01160392, -0.05707432, 0.05759784, -0.03221925, 0.03217333, -0.05070265, 0.05118556)), 
       .Names = c("Market", "Type", "After_Fees_Collapsed", "AFC_Signed"), class = "data.frame", row.names = c(NA, -10L)) 
関連する問題