ข้อมูลมีให้ที่ด้านล่างของหน้า ฉันมี 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 คอลัมน์ และค้นหาการประท้วงที่ใกล้เคียงที่สุดกับคอลัมน์ราคาใน 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