假設我有以下資料:
library(data.table)
x1 <- structure(list(age = c(NA, 40L, 78L, 49L, 59L),
age_cat = c(NA, "(39,50]", "(72,83]", "(39,50]", "(57,64]")),
row.names = c(NA, -5L), class = c("data.table", "data.frame"))
x2 <- structure(list(age = c(20.5, 25.5, 30.5, 35.5, 40.5, 45.5, 50.5,
55.5, 60.5, 65.5, 70.5, 75.5, 80.5, 85.5, 90.5),
yhat = c(2.04759618619815, 1.48463998876167,
1.20171574722936, 1.05038762605566,
1.00519209126108, 0.996948029536619,
0.945501768666378, 0.834241582084186,
0.731586245690655, 0.727522200367293,
0.816133858934611, 0.817941581611403,
0.498731829342745, 0.104433989674483,
1.59446835516229)),
row.names = c(NA, -15L),
class = "data.frame")
然后創建一個函式來加入最近的年齡:
join_nearest <- function(dat, reference, x){
reference <- data.table::data.table(reference)
dat <- data.table::data.table(dat)
join <- reference[dat, roll = "nearest", on = x]
as.data.frame(join)
}
這給出了以下解決方案:
join_nearest(x1, x2, "age")
#> age yhat age_cat
#> 1 NA 2.0475962 <NA>
#> 2 40 1.0051921 (39,50]
#> 3 78 0.8179416 (72,83]
#> 4 49 0.9455018 (39,50]
#> 5 59 0.7315862 (57,64]
如果age等于 NA,我希望它yhat也等于 NA。我想知道為什么不是這樣,有沒有辦法age為等于NA 的行回傳NA?
由reprex 包(v2.0.1)于 2021 年 11 月 10 日創建
uj5u.com熱心網友回復:
您可以手動執行基于范圍的聯接。
前面:x1$age是整數但是x2$age數字,所以我會將第一個轉換為,numeric以便 data.table 不會抱怨類。
從那里,我將創建 lo/hi 欄位x2,我們可以用它來加入。如果您希望斷點不在一半,那么根據您的需要進行更改很容易。
x1[, age := as.numeric(age)]
x1[x2[, c("lo","hi") := .(age - c(age[1],diff(age)/2), age c(diff(age)/2,Inf))
], yhat := i.yhat, on = .(age >= lo, age < hi),
][]
# age age_cat yhat
# <num> <char> <num>
# 1: NA <NA> NA
# 2: 40 (39,50] 1.0051921
# 3: 78 (72,83] 0.4987318
# 4: 49 (39,50] 0.9455018
# 5: 59 (57,64] 0.7315862
## cleanup
x2[, c("lo","hi") := NULL]
我認識到添加lo和的暫時副作用hi,因此進行清理。如果您的資料不大,您可以通過使用copy(x2)[,c("lo","hi"):=...]來避免這種情況,但代價是記憶體效率低下。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/355718.html
上一篇:mybatis的配置優化
