使用通用数据:
set.seed(456)
a <- sample(0:1,50,replace = T)
b <- rnorm(50,15,5)
df1 <- data.frame(a,b)
c <- seq(0.01,0.99,0.01)
d <- rep(NA, 99)
for (i in 1:99) {
d[i] <- 0.5*(10*c[i])^2+5
}
df2 <- data.frame(c,d)
对于每个df1$b
,我们希望找到最近的df2$d
。
然后我们创建一个新变量df1$XYZ
,它取最近df2$c
的{{1}}值
这question引导我走向df2$d
图书馆。但我不确定是否也可以使用data.table
和ddplyr
:
这是我的group_by
尝试:
data.table
答案 0 :(得分:4)
这是data.table
的一种方式:
require(data.table)
setDT(df1)[, XYZ := setDT(df2)[df1, c, on=c(d="b"), roll="nearest"]]
对于每df2$c
,您需要df2$d
与df1$b
中最接近的值相对应。因此,我们需要以df2[df1]
加入,这会产生nrow(df1)
行。可以使用setDT(df2)[df1, c, on=c(d="b"), roll="nearest"]
来完成。
它返回您需要的结果。我们需要做的就是将其添加回名为df1
的{{1}}。我们使用XYZ
。
构建滚动连接的思维过程是这样的(假设:=
和df1
都是数据表):
我们需要为df2
的每一行获取一些值。这意味着,df1
语法为i = df1
。
x[i]
我们需要df2[df1]
加入df2$d
。使用df1$b
即可:
on=
我们只需要df2[df1, on=c(d="b")]
列。使用c
仅选择该列。
j
我们不需要 equi-join ,但滚动到最近的加入。
df2[df1, c, on=c(d="b")]
希望这有帮助。