【问题标题】:Merging Items each with 2 Rows for calculations specific to Item's Row 1 and Row 2合并每个具有 2 行的项目,用于特定于项目的第 1 行和第 2 行的计算
【发布时间】:2017-12-22 06:55:27
【问题描述】:

我已设法处理我的数据,将当前商品的多次买入/卖出减少为 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 Signed 列只是“费用崩溃后”列乘以 -1 表示买入。这样我就可以通过运行下面的代码来计算净结果。但是,我相信,如果正确回答了这个问题,我可以取消 AFC 签名列,直接使用我的 BUY 和 SELL 行中的值。

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

我想做的是将 ITEM_# 折叠成一行,其中有一列用于“Nett”(源自特定 ITEM 的 SELL-BUY)和一列用于“% Nett”(源自特定 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%

【问题讨论】:

  • 代码 sn-p 形成是浪费空间。它们不会运行......不要用于 R 代码。

标签: r dplyr


【解决方案1】:
  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

【讨论】:

  • 你可以去掉多余的列
【解决方案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`

【讨论】:

  • 看起来这不是一个真正的答案,虽然我可以理解不希望它失去格式。
  • 我只是在说明正确的方法。您可以使用高级的丑陋技巧,或者您可以重新格式化输入数据,这更容易,特别是如果配对正确,然后一切都变得微不足道。另外,请注意,如果输入数据未正确配对,超级但丑陋的黑客将在结果表中插入不易识别的垃圾。
  • @n.caillou 我知道更好的数据集是理想的,但是这是从在线资源导出的数据集,我无法控制格式
  • @Shawn 答案解释了如何重新格式化数据。如果数据来自第三方,检查数据是否正确配对更为重要
【解决方案3】:

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))

【讨论】:

    猜你喜欢
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    相关资源
    最近更新 更多