Вернуть значения столбца, связанные со значениями, возвращаемыми функцией «суммировать», используемыми в другом столбце. - PullRequest
1 голос
/ 30 апреля 2019

У меня есть функция, которая суммирует первые лучшие значения для столбца abs.

abs5_fun <- function(x) {

...
  buysell <- group_by_at(buysell, vars(TIME,SECCODE, DAY))
  buysell$abs <- (buysell$PRICE.y - buysell$PRICE.x)/(buysell$PRICE.y + buysell$PRICE.x)/2
  abs1 <- as.data.frame(summarise(buysell, abs = (head(sort(abs),5)[1])))
  abs2 <- as.data.frame(summarise(buysell, abs = (head(sort(abs),5)[2])))
  abs3 <- as.data.frame(summarise(buysell, abs = (head(sort(abs),5)[3])))
  abs4 <- as.data.frame(summarise(buysell, abs = (head(sort(abs),5)[4])))
  abs5 <- as.data.frame(summarise(buysell, abs = (head(sort(abs),5)[5])))
  return(as.data.frame(list(abs1 = abs1, abs2 = abs2, abs3 = abs3, abs4 = abs4, abs5 = abs5)))
}

Вход выглядит так:

head(dataframe)

DAY      NO      SECCODE BUYSELL      TIME ORDERNO ACTION   PRICE VOLUME TRADENO TRADEPRICE
1   1  265281 SU46020RMFS2       S 100142905  136109      1 67.0000    500      NA         NA
2   1 1973817 SU26212RMFS9       B 101622474  983190      1 64.0000      4      NA         NA
3   1 1988822 SU26212RMFS9       S 101635958  990616      1 70.0000      4      NA         NA
4   1 2120163 SU25077RMFS7       S 101857791 1055751      1 96.0000     50      NA         NA
5   1 2344802 SU26212RMFS9       S 102829364 1165773      1 69.9999      4      NA         NA
6   1 2358352 SU26212RMFS9       S 102905724 1165773      0 69.9999      4      NA         NA

Выход:

abs5 <- abs5_fun(dataframe)

 abs1.TIME abs1.SECCODE abs1.DAY     abs1.abs abs2.TIME abs2.SECCODE abs2.DAY     abs2.abs abs3.TIME abs3.SECCODE
1     1e+08 SU24018RMFS2      100 0.0014609644     1e+08 SU24018RMFS2      100 0.0014609644     1e+08 SU24018RMFS2
2     1e+08 SU24018RMFS2      101 0.0024485414     1e+08 SU24018RMFS2      101 0.0024497609     1e+08 SU24018RMFS2
3     1e+08 SU24018RMFS2      102 0.0019588639     1e+08 SU24018RMFS2      102 0.0024509804     1e+08 SU24018RMFS2
4     1e+08 SU24018RMFS2      103 0.0022021537     1e+08 SU24018RMFS2      103 0.0022021537     1e+08 SU24018RMFS2
5     1e+08 SU24018RMFS2      104 0.0009779834     1e+08 SU24018RMFS2      104 0.0009779834     1e+08 SU24018RMFS2
6     1e+08 SU24018RMFS2      105 0.0016360580     1e+08 SU24018RMFS2      105 0.0018791211     1e+08 SU24018RMFS2
  abs3.DAY    abs3.abs abs4.TIME abs4.SECCODE abs4.DAY    abs4.abs abs5.TIME abs5.SECCODE abs5.DAY    abs5.abs
1      100 0.001461209     1e+08 SU24018RMFS2      100 0.001461209     1e+08 SU24018RMFS2      100 0.001485684
2      101 0.002450736     1e+08 SU24018RMFS2      101 0.003181596     1e+08 SU24018RMFS2      101 0.003188528
3      102 0.003660322     1e+08 SU24018RMFS2      102 0.004152418     1e+08 SU24018RMFS2      102 0.005174714
4      103 0.002688998     1e+08 SU24018RMFS2      103 0.003926307     1e+08 SU24018RMFS2      103 0.003926307
5      104 0.001100023     1e+08 SU24018RMFS2      104 0.001100023     1e+08 SU24018RMFS2      104 0.003165124
6      105 0.002445941     1e+08 SU24018RMFS2      105 0.002689000     1e+08 SU24018RMFS2      105 0.005413142

Мне нужно вернуть значения VOLUME, связанные с abs1.abs, abs2.abs и т. Д.

Я попытался получить все возможные комбинации abs и VOLUME для каждого TIME и DAY, а затем с помощью inner_join и сопоставить по abs, VOLUME и всем другим столбцам, но результаты всегда смещены в моем большом наборе данных.

Мне бы хотелось иметь сгруппированный тиббл с первыми 5 лучшими abs и ассоциированным VOLUME в результате, но я не уверен, как использовать summarise в этом случае. Вопрос в том, что я должен добавить к этой части функции:

  abs1 <- as.data.frame(summarise(buysell, abs = (head(sort(abs),5)[1])))
  abs2 <- as.data.frame(summarise(buysell, abs = (head(sort(abs),5)[2])))
  abs3 <- as.data.frame(summarise(buysell, abs = (head(sort(abs),5)[3])))
  abs4 <- as.data.frame(summarise(buysell, abs = (head(sort(abs),5)[4])))
  abs5 <- as.data.frame(summarise(buysell, abs = (head(sort(abs),5)[5])))
...