Данные приведены внизу страницы.У меня есть 2 фрейма данных df1 и df2.
df1:
ticker Price
<chr> <dbl>
SPY 200.00
AAPL 100.00
df2:
ticker expiration strike
<chr> <dbl> <dbl>
SPY 0621 180
SPY 0621 205
SPY 0719 180
SPY 0719 205
AAPL 0621 75
AAPL 0621 105
AAPL 0719 75
AAPL 0719 105
Оба фрейма данных имеют данные о запасах и разделяют столбец "тикер".Я хотел бы сгруппировать df2 по 2 столбцам, а затем найти ближайший страйк к столбцу Price в df1.
Результат будет выглядеть примерно так.
df3 = df2 %>% group_by(ticker, expiration)%>% #which[abs(df1$Price - df2$strike) is closest to 0]
output:
ticker expiration strike
<chr> <dbl> <dbl>
SPY 0621 205
SPY 0719 205
AAPL 0621 105
AAPL 0719 105
Вот df1
structure(list(ticker = structure(2:1, .Label = c("AAPL", "SPY"
), class = "factor"), Price = c(200, 100)), class = "data.frame", row.names = c(NA,
-2L))
Вот df2
structure(list(ticker = structure(c(2L, 2L, 2L, 2L, 1L, 1L, 1L,
1L), .Label = c("AAPL", "SPY"), class = "factor"), expiration = c(621,
621, 719, 719, 621, 621, 719, 719), strike = c(180, 205, 180,
205, 75, 100, 75, 100)), class = "data.frame", row.names = c(NA,
-8L))
Меня интересует ответ @akrun data.table.Однако я не получаю полный желаемый результат.0719 для SPY отсутствует.
library(data.table)
setDT(df2)[, Price := strike][df1, on = .(ticker, Price), roll = -Inf]
ticker expiration strike Price
1: SPY 621 205 200
2: AAPL 621 100 100
3: AAPL 719 100 100