根据与其他数据帧最近的邻居分配值

时间:2015-11-06 08:47:39

标签: r data.table dplyr

使用通用数据:

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.tableddplyr

这是我的group_by尝试:

data.table

1 个答案:

答案 0 :(得分:4)

这是data.table的一种方式:

require(data.table)
setDT(df1)[, XYZ := setDT(df2)[df1, c, on=c(d="b"), roll="nearest"]]

对于每df2$c,您需要df2$ddf1$b中最接近的值相对应。因此,我们需要以df2[df1]加入,这会产生nrow(df1)行。可以使用setDT(df2)[df1, c, on=c(d="b"), roll="nearest"]来完成。

它返回您需要的结果。我们需要做的就是将其添加回名为df1的{​​{1}}。我们使用XYZ

构建滚动连接的思维过程是这样的(假设:=df1都是数据表):

  1. 我们需要为df2的每一行获取一些值。这意味着,df1语法为i = df1

    x[i]
  2. 我们需要df2[df1] 加入df2$d。使用df1$b即可:

    on=
  3. 我们只需要df2[df1, on=c(d="b")] 列。使用c仅选择该列。

    j
  4. 我们不需要 equi-join ,但滚动到最近的加入。

    df2[df1, c, on=c(d="b")]
    
  5. 希望这有帮助。