Data disediakan di bagian bawah halaman. Saya memiliki 2 bingkai data df1 dan 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
Kedua bingkai data memiliki data stok dan berbagi kolom "ticker". Saya ingin mengelompokkan df2 berdasarkan 2 kolom dan kemudian menemukan pukulan terdekat dengan kolom Harga di df1.
Outputnya akan terlihat seperti ini.
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
Ini 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))
Ini 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))
Saya tertarik dengan jawaban @akrun data.table. Namun saya tidak mendapatkan hasil penuh yang diinginkan. 0719 untuk SPY tidak ada.
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