我有一個如下所示的資料集:
> head(mydata)
id value1 value2
1: 1 200001 300001
2: 2 200002 300002
3: 3 200003 300003
4: 4 200004 300004
5: 5 200005 300005
6: 6 200006 300006
value1并value2代表給定年份開始和結束時的金額。我想為每個 id(即按行)線性插入給定月份的值。
在嘗試了速度較慢的不同選項之后,我目前正在使用map2來自purrr包和approx來自基礎 R 的組合。我使用包中的參考賦值創建新變數data.table。這仍然出奇地慢,因為我的代碼在我的資料(170 萬行)上運行大約需要 2.2 分鐘。
請注意,我還使用get()訪問變數進行插值,因為它們的名稱需要是動態的。這會減慢我的代碼速度,但它似乎并不是瓶頸。此外,我曾嘗試通過使代碼并行來使用該furrr包來加速map2,但速度提升并不重要。
下面是具有 1000 行資料的可重現示例。非常感謝任何有助于加快代碼速度的幫助!
mydata <- data.table(id = 1:1000, value1= 2001:3000, value2= 3001:4000)
floor_value <- "value1"
ceiling_value <- "value2"
m <- 7
monthly_sum_assured <- function(a, b, m) {
monthly_value <- approx(x = c(0, 12), c(a, b), xout = m)$y
}
mydata[, interpolated_value := map2(get(floor_value), get(ceiling_value),
~ monthly_sum_assured(.x, .y, m))]
uj5u.com熱心網友回復:
只需使用線性插值公式對整個data.table.
mydata <- data.table(id = 0:1e6, value1= 2e6:3e6, value2= 3e6:4e6)
floor_value <- "value1"
ceiling_value <- "value2"
m <- 7
monthly_sum_assured <- function(a, b, m) {
monthly_value <- approx(x = c(0, 12), c(a, b), xout = m)$y
}
system.time({
mydata[, interpolated_value := map2(get(floor_value), get(ceiling_value),
~ monthly_sum_assured(.x, .y, m))]
})
#> user system elapsed
#> 41.50 0.53 42.05
system.time({
mydata[, interpolated_value2 := get(floor_value) m*(get(ceiling_value) - get(floor_value))/12]
})
#> user system elapsed
#> 0 0 0
identical(unlist(mydata$interpolated_value), mydata$interpolated_value2)
#> [1] TRUE
m當是矢量時,它的作業速度也一樣快。
m <- sample(12, 1e6 1, 1)
system.time({
mydata[, interpolated_value2 := get(floor_value) m*(get(ceiling_value) - get(floor_value))/12]
})
#> user system elapsed
#> 0.01 0.00 0.02
uj5u.com熱心網友回復:
它更快map2_dbl嗎? map2將回傳一個串列,但我認為你想要一個數字結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/534819.html
